scent2d 2019. 1. 11. 10:23

→ 힌트 정보 확인.




→ BOF 문제로 확인된다. 일단 소스가 오픈되어서 해당 소스를 바탕으로 컴파일한 후,  gdb로 디버깅한다.


0x08048420 <main+0>:    push   ebp

0x08048421 <main+1>:    mov    ebp,esp

0x08048423 <main+3>:    sub    esp,0x28

0x08048426 <main+6>:    and    esp,0xfffffff0

0x08048429 <main+9>:    mov    eax,0x0

0x0804842e <main+14>:    sub    esp,eax

0x08048430 <main+16>:    sub    esp,0xc

0x08048433 <main+19>:    push   0x8048554

0x08048438 <main+24>:    call   0x8048350 <printf>

0x0804843d <main+29>:    add    esp,0x10

0x08048440 <main+32>:    sub    esp,0x4

0x08048443 <main+35>:    push   ds:0x8049698 

0x08048449 <main+41>:    push   0x28 //

0x0804844b <main+43>:    lea    eax,[ebp-40]       buf            

0x0804844e <main+46>:    push   eax buf

0x0804844f <main+47>:    call   0x8048320 <fgets>

0x08048454 <main+52>:    add    esp,0x10

0x08048457 <main+55>:    sub    esp,0x4

0x0804845a <main+58>:    push   0x2

0x0804845c <main+60>:    push   0x804856a

0x08048461 <main+65>:    lea    eax,[ebp-24]              buf2     

0x08048464 <main+68>:    push   eax

0x08048465 <main+69>:    call   0x8048330 <strncmp>

0x0804846a <main+74>:    add    esp,0x10

0x0804846d <main+77>:    test   eax,eax

0x0804846f <main+79>:    jne    0x80484a6 <main+134>

0x08048471 <main+81>:    sub    esp,0xc

0x08048474 <main+84>:    push   0x804856d

0x08048479 <main+89>:    call   0x8048350 <printf>

0x0804847e <main+94>:    add    esp,0x10

0x08048481 <main+97>:    sub    esp,0x8

0x08048484 <main+100>:    push   0xbc2

0x08048489 <main+105>:    push   0xbc2

0x0804848e <main+110>:    call   0x8048360 <setreuid>

0x08048493 <main+115>:    add    esp,0x10

0x08048496 <main+118>:    sub    esp,0xc

0x08048499 <main+121>:    push   0x804857a

0x0804849e <main+126>:    call   0x8048310 <system>

0x080484a3 <main+131>:    add    esp,0x10

0x080484a6 <main+134>:    leave  

0x080484a7 <main+135>:    ret



→ buf 변수의 값을 입력할 수 있고, 소스코드 상의 /bin/bash를 실행하려면 buf2 변수의 앞 2바이트를 'go'로 변경해야 한다. 즉 버퍼오버플로우를 일으켜야 한다.


→ 사용자 입력 값을 받는 변수는 buf이고, 위치는 ebp-40 이다. 그리고 buf2 변수의 위치는 ebp-24이다. buf2 변수의 앞 2바이트를 변경하기 위한 페이로드를 가정한 스택구조는 아래와 같이 그릴 수 있다.




→ 위의 페이로드를 실행하면, 문제를 해결할 수 있다.