본문 바로가기

System Hacking/vortex

overthewire :: Vortex level6 by ORANG



헥스 레이로 보면..



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