-
lvl 09Wargame/HackerSchool FTZ 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바이트를 변경하기 위한 페이로드를 가정한 스택구조는 아래와 같이 그릴 수 있다.
→ 위의 페이로드를 실행하면, 문제를 해결할 수 있다.
댓글