CTF | wargame

3DS CTF - Warmup (간단한 reversing)

nopdata 2017. 3. 7. 21:55
keyword : 간단한 reversing

리버싱 문제이다. 32비트 리눅스 프로그램인데 실행을 시키면 아무런 반응도 나타나지 않는다.
gdb로 열어보면 flag라는 함수가 있는데, 구동이 되지 않는다.

flag 함수 호출 매개변수는 pushl (eax), push 0x2a가 된다. 이제 flag 메소드를 보면 아래와 같다.

flag메소드에서 하나씩 넘어왔을 때, 저 부분에서 jmp가 되는데 바로 위 구문을 보면 0x2a와 0x8(%ebp)를 비교한다.
즉, 넘어온 매개변수가 0x2a가 같아야 성공인데, 메소드를 보면 고정적으로 0x2a가 넘어오기 때문에 성공이 되지 않는다.
만약 성공을 하면 flag + 50위치로 넘어가게 되고, 여기서 부터 1문자씩 출력을 한다.
putchr(0x33), 0x44 ... 이런식이고 이 문자열들을 종합하면 '3DS{0p1n1@' 까지 putchar로 나오게 된다.

zero flag 변조를 통해 0x2a 비교 구문을 넘어뛰면 putchar가 끝나는 지점에 위 구문이 또 있다.여기서 우회를 하지 않으면 중간에 printf구문이 하나 씹히게 된다. 여기도 우회를 해줘야 한다.
flag + 202지점으로 바로 뛰어넘게 되고 printf를 호출하는데 매개변수값으로 3이 두번 들어간다.
printf로 넘어가는 문자열 0x80485e2를 따라가 보면

0x64257270 6x6425646e -> 'pr%dnd%d}\n' 가 되고 매개변수로 3이 두번 들어갔으므로, 결과로 출력되는 값은 pr3nd3}이 된다. 이값을 앞에나온 값과 붙이면 3DS{0p1n1@_te_pr3nd3} 이 된다.
실제 비교 구문 우회로 출력을 해보면 다음과 같다.

따라서 답은 3DS{0p1n1@_te_pr3nd3}이 된다.