Dump of assembler code for function main:
0x0000000000400526 <+0>: push rbp
0x0000000000400527 <+1>: mov rbp,rsp
0x000000000040052a <+4>: sub rsp,0x10
0x000000000040052e <+8>: mov DWORD PTR [rbp-0x4],0x1
0x0000000000400535 <+15>: cmp DWORD PTR [rbp-0x4],0x0
0x0000000000400539 <+19>: jne 0x40058d <main+103>
0x000000000040053b <+21>: mov DWORD PTR [rbp-0x8],0x0
0x0000000000400542 <+28>: jmp 0x400571 <main+75>
0x0000000000400544 <+30>: mov eax,DWORD PTR [rbp-0x8]
0x0000000000400547 <+33>: cdqe
0x0000000000400549 <+35>: movzx eax,BYTE PTR [rax+0x6010e0]
0x0000000000400550 <+42>: mov edx,eax
0x0000000000400552 <+44>: mov eax,DWORD PTR [rbp-0x8]
0x0000000000400555 <+47>: cdqe
0x0000000000400557 <+49>: mov eax,DWORD PTR [rax*4+0x601060]
0x000000000040055e <+56>: add eax,edx
0x0000000000400560 <+58>: mov edx,eax
0x0000000000400562 <+60>: mov eax,DWORD PTR [rbp-0x8]
0x0000000000400565 <+63>: cdqe
0x0000000000400567 <+65>: mov BYTE PTR [rax+0x6010e0],dl
0x000000000040056d <+71>: add DWORD PTR [rbp-0x8],0x1
0x0000000000400571 <+75>: cmp DWORD PTR [rbp-0x8],0x1e
0x0000000000400575 <+79>: jle 0x400544 <main+30>
0x0000000000400577 <+81>: mov esi,0x6010e0
0x000000000040057c <+86>: mov edi,0x400638
0x0000000000400581 <+91>: mov eax,0x0
0x0000000000400586 <+96>: call 0x400400 <printf@plt>
0x000000000040058b <+101>: jmp 0x40059c <main+118>
0x000000000040058d <+103>: mov edi,0x400648
0x0000000000400592 <+108>: mov eax,0x0
0x0000000000400597 <+113>: call 0x400400 <printf@plt>
0x000000000040059c <+118>: mov eax,0x0
0x00000000004005a1 <+123>: leave
0x00000000004005a2 <+124>: ret
End of assembler dump.
문제를 gdb로 분석하면 위와 같다. 이상한 점은 printf 함수가 두 번 있지만 실제로 실행해보면 두 번째 printf만 호출된다.
printf("flag를 뛰어넘었습니다!");
0x000000000040052e <+8>: mov DWORD PTR [rbp-0x4],0x1
0x0000000000400535 <+15>: cmp DWORD PTR [rbp-0x4],0x0
0x0000000000400539 <+19>: jne 0x40058d <main+103></main+103>
위 코드를 보면 [rbp-4]에 1을 넣고 0과 비교하면 당연히 거짓이다. 따라서 jne 명령어에 의해 두번째 printf의 위치로 이동하게 되는데 첫번째 printf가 실행되기 하기위해 아래 cmp 실행 전 브레이크 포인트를 걸고 set *주소 명령어를 통해 $rbp-4에 해당하는 주소에 0을 삽입한다. 그리고 continue하면 첫번째 printf가 출력되고 플래그도 볼 수 있다.
0x0000000000400535 <+15>: cmp DWORD PTR [rbp-0x4],0x0
'Reversing > CTF' 카테고리의 다른 글
[HackCTF] Keygen (0) | 2021.10.09 |
---|---|
[HackCTF] Strncmp (0) | 2021.09.12 |
[HackCTF] Reversing Me (0) | 2021.09.10 |
[HackCTF] Welcome_REV (0) | 2021.09.10 |
[DIMI CTF] gorev (0) | 2021.08.06 |
댓글