목록Write-up (52)
또 뭐하지
풀이main 함수를 보자. 이번에는 sub_140001000 함수를 봐야한다. 함수를 살펴보면 a[i]+a[i+1] 이 byte_140003000의 배열값과 일치하면 된다. 여기서 생각해보면 (byte_140003000의 배열값이 data라고 할 때)data[0] = a[0] + a[1]data[1] = a[1] + a[2]...data[23] = a[23] + a[24]이다. data[23] = 0 인데 a는 unsigned integer이니까 a[23] = a[24] = 0 이어야 data[23] = 0일 수 있는 것을 알 수 있다. byte_140003000에서의 값을 찾아오자. hex_string = "AD D8 CB CB 9D 97 CB C4 92 A1 D2 D7 D2 D6 A8 A5 DC C7..
풀이main 함수이다. sub_140001000 함수을 살펴보자.함수를 살펴보면 byte_140003000에 위치한 배열과 a1의 상위 4비트, 하위 4비트의 위치를 바꾼 값과 비교해서 일치하면 되는 것을 확인할 수 있다. byte_140003000의 배열값을 복사하고, 파이썬 코드를 작성하자. 배열값의 상위 4비트, 하위4비트의 위치를 바꾸면 원하는 값을 얻을 수 있을 것이다. data = bytes.fromhex("24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27 13 26 26 C6 56 F5 C3 C3 F5 E3 E3 00 00 00 00 00")tmp = []for i in range(28): a = (data[i]>4)%256 tmp.append(..
풀이main 함수를 확인해보자. 이번에는 sub_140001000 함수를 확인해보면 correct가 출력되는 입력값을 알 수 있다. 함수를 살펴보면 24까지 for문이 돌고 있고 byte_140003000에 위치한 배열과 (i^a1)+2*i 값을 비교하고 있다. 그러면 우리가 원하는 값은 주소값에 위치한 배열값을 x라고 할 때, (x-2*i)^i 인 것을 알 수 있다. 그러면 이제 x를 구하고 연산하는 파이썬 코드를 작성해보자. byte_140003000로 이동해보면 배열 값을 확인할 수 있다. Hex View로 더 보기좋게 확인할 수 있다. 이 바이트값을 복사해서 연산을 해주자. data = bytes.fromhex("49 60 67 74 63 67 42 66 80 78 69 69 7B 99 6D ..
풀이실행파일의 main 함수를 살펴보자. 이번에는 sub_140001000 함수가 중요한 것 같으니 살펴보자.sub_140001000 함수를 살펴보면 배열 aC와 주소 a1에서 시작하는 메모리의 내용이 일치해야한다. 여기서 a1은 입력을 받는 값이니 우리가 원하는 문자열은 배열 aC에 있을 것이다. aC 배열을 살펴서 순서대로 읽어보면 원하는 입력값을 찾을 수 있다. * main 함수에 있는 주소값을 더하며 비교하는 구문 . 해당 주소값으로 가면 플래그를 확인할 수 있다.
풀이IDA를 통해 chall의 main 함수 코드를 살펴보면1. Random number v6와 사용자 입력값 v7을 xor하여 v11을 얻는다2. s1은 s(=v11)을 거꾸로 저장한 것이다3. s1=s2=a0b4c1d7과 같으면 flag를 출력한다 Random number와 입력값의 xor 값이 7d1c4b0a와 같으면 된다. 즉, 7d1c4b0a와 Random number를 xor한 값을 입력해주면된다. from pwn import *r = remote('host3.dreamhack.games', 21711)r.recvuntil(b': ')a = r.recvline()a = a.decode('utf-8').strip()b = int(a, 16)^ 0x7d1c4b0ab = str(b).encode()..
풀이 rev-basic-0 때와 동일하게 correct가 나오는 부분으로 타고 들어갔다. main함수 코드를 살펴보면 sub_140001000 함수에 따라 correct 또는 wrong이 나오는 것을 알 수 있다.sub_140001000를 살펴보면 입력값의 각 자리가 조건에 모두 만족해야한다는 걸 확인했다. 여기서 'r' 단축키를 이용해서 숫자를 문자로 변환해서 원하는 문자열을 얻을 수 있었다. 배운점IDA는 단축키를 잘 쓸 줄 알아야겠구나이름 재설정(n): 함수, 변수의 이름을 변경합니다.숫자-문자 아스키코드 변환(r): 아스키코드 테이블에 따라 숫자는 문자로, 문자는 숫자로 변환합니다.
풀이#!/usr/bin/env python3import randomimport signalimport sysMENU_GAMBLE = 1MENU_VERIFY = 2MENU_FLAG = 3MENU_LEAVE = 4money = 500verified = Falsedef show_menu(): print('=======================================') print('1. go to gamble') print('2. verify you\'re a robot') print('3. buy flag') print('4. leave')def get_randn(): return random.randint(0, 0xfffffffe)..
풀이먼저 flag파일의 경로를 hex로 변환한다. 여기서 리틀엔티안방식으로 정렬하는거 기억해야한다!section .textglobal _start_start: push 0x0 mov rax, 0x676e6f6f6f6f6f6f push rax mov rax, 0x6c5f73695f656d61 push rax mov rax, 0x6e5f67616c662f63 push rax mov rax, 0x697361625f6c6c65 push rax mov rax, 0x68732f656d6f682f push rax mov rdi, rsp xor rsi, rsi xor rdx, rdx mov rax, 2 ..