본문 바로가기
Reversing/CTF

[HackCTF] Handray

by L3m0n S0ju 2021. 9. 11.

 

 

 

 

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

댓글