목록Write-up/Reversing (13)
또 뭐하지

풀이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): 아스키코드 테이블에 따라 숫자는 문자로, 문자는 숫자로 변환합니다.

풀이문제파일을 실행해보고 아무거나 입력을 해보았다. IDA를 통해 문제파일을 열어서 바이너리에 포함된 문자열을 확인했다. Compar3_the_str1ng이 의심스럽지만, 일단 Wrong에 반대되는 Correct를 찾았다. 이게 어떻게 출력되는지 찾으면 원하는 문자열을 찾을 수 있을 것 같다. 단축키 'x'를 통해서 Correct가 참조되는 함수를 확인했다. 단축키 'F5'를 통해서 해당 부분을 디컴파일 해보았다. 디컴파일된 코드가 나왔다. 여기서 sub_7FF7C5CF1000 함수의 결과에 따라서 Correct 또는 Wrong이 출력되는 것을 확인할 수 있다. 그럼 이제 sub_7FF7C5CF1000를 확인해봤다. Compar3_the_str1ng과 입력값을 비교해서 같은지 확인하고 있다. 원하는 문..