키워드: Reversing
코드 분석
처음에 문제파일을 받으면 실행이되지 않아서 strings 명령어로 확인해보면 UPX
라는 단어를 찾을 수 있었고 구글링을 통해서 압축 프로그램이라는 것을 알 수 있었다. 아래의 명령어로 압축을 풀어준다.
1
upx -d <file_name>
그러면 ida로 정상적으로 확인이 가능했다. main
함수를 보면 누가봐도 플레그로 추정되는 정수 값들이 있었다. v4
변수에 의해서 분기가 이루어지고 있고 v10
이 사용자 입력 값으로 추측할 수 있다.
하지만 일반적인 바이트 형태가 아니었기 때문에 어떻게 저런 값들이 나오는지 확인해 볼 필요가 있다. 따라서 gdb
를 이용한다. 정수 값들이 rsi
레지스터에 들어가기 전인 0x404D2D
를 브레이크 포인트로 잡아주고 HTB{
를 입력한다.
그리고 i r
명령어를 통해 레지스터 값들을 확인해본다.
사용자의 입력 값은 앞서 rax
레지스터에 있을 것으로 판단되므로 그 부분을 확인해보면 다음과 같이 비교하는 정수 값과 일치한다.
확인을 위해서 ABCDEF
를 입력해보면 정확히 16씩 증가하는 것을 알 수 있다.
Get Flag
1040을 16으로 나누면 65이다. 이는 아스키 65번 즉 A
를 나타낸다. 따라서 모든 정수를 16으로 나누어주면 된다.
1
2
3
4
5
6
7
8
9
info = lambda x: print(f'[+] {x}')
key_array =[1152,1344,1056,1968,1728,816,1648,784,1584,816,1728,1520,1840,1664,784,1632,1856,1520,1728,816,1632,1856,1520,784,1760,1840,1824,816,1584,1856,784,1776,1760,528,528,2000]
flag =''
for i in key_array:
flag += chr((i//16))
info(f'Flag is {flag}')
간만에 gdb 써본다. 처음에는 맥북에서 도커를 통해 gdb 환경을 구성하려고 했지만 어떠한 이유에서인지 계속 아래처럼 뜬다… 그래서 짱나서 걍 윈도우 컴에서 돌렸다.
Comments powered by Disqus.