헥스 레이로 보면..
if(*(_DWORD *)a3) 일경우 restart(*argv)함수가 호출된다.
restart함수에서는 *argv에서 그대로
execlp(argv[0], argv[0], 0)으로 이어지므로, argv[0]에 실행시킬 파일명을 넣어주면 된다.
일반적으로 main(int argc, char **argv, char **env)이면
ebp -> SFP
ebp+4 -> RET
ebp+8 -> argc
ebp+12 -> argv
ebp+16 -> env
인자 전달시 이런식으로 진행된다.
gdb로 간단하게 분석해보자면..
<main함수>
0x0804846f <+9>: mov 0x10(%ebp),%eax 0x08048472 <+12>: mov (%eax),%eax 0x08048474 <+14>: test %eax,%eax 0x08048476 <+16>: je 0x8048485 <main+31> |
ebp+0x10, env 부분이 NULL인지 확인한다. NULL이 아닐 경우 restart로 그대로 진행
0x08048478 <+18>: mov 0xc(%ebp),%eax 0x0804847b <+21>: mov (%eax),%eax 0x0804847d <+23>: mov %eax,(%esp) 0x08048480 <+26>: call 0x8048444 <restart> |
ebp+0xc, **argv를 eax에 저장 // main+18
*argv를 다시 eax에 저장 // main+21
eax값을 현재의 esp에 저장하고 restart 호출 //main+23, main+26
<restart함수>
0x08048452 <+14>: mov 0x8(%ebp),%eax 0x08048455 <+17>: mov %eax,0x4(%esp) 0x08048459 <+21>: mov 0x8(%ebp),%eax 0x0804845c <+24>: mov %eax,(%esp) 0x0804845f <+27>: call 0x8048360 <execlp@plt> |
execlp 호출
간단하지만 익스플로잇을 보면..
vortex6.bin
'System Hacking > vortex' 카테고리의 다른 글
overthewire :: Vortex level8 by ORANG (0) | 2014.10.30 |
---|---|
overthewire :: Vortex level7 by ORANG (0) | 2014.10.25 |
overthewire :: Vortex level5 by ORANG (0) | 2014.10.23 |
overthewire :: Vortex level4 by ORANG (0) | 2014.10.20 |
overthewire :: Vortex level3 by ORANG (0) | 2014.10.20 |