最近对pwn上头了,找点题做做
拖入ida
这里第一次判断只允许输入小于0x100的数字,作为第二次输入的长度
第二次明显存在栈溢出
但是程序中并没有好用的gadget,没有csu函数
没有write函数泄露libc地址,
观察程序,发现eax,edx,rsi可控,eax可控可以想到用SROP
但是程序中并没有syscall语句
思路打开
看了其他师傅的文章,知道了read函数中向下不定几个字节,有syscall语句
如下图。根据libc不同,偏移不同,实际做题时,只需要爆破一个字节。
rsi可控,可以调用read函数劫持read的got表,使其指向syscall的地址,根据上图,可以知道最后一个字节应该填充4c,别忘了是小端序存储数据,也就是只用发送一个字节的数据就可以覆盖源地址的40到4c。
我的思路是可以利用srop将栈地址迁移到bss段,然后输入/bin/sh
再调用execve系统中断。 解法不只这一种。
因为第一次栈溢出只可输入0x100个字节,不够传输SigreturnFrame。所以我们先构造一个可以任意输入长度的read函数,然后再进行got劫持等后面的操作。
以下所有的栈中具体参数偏移的位置都是动态调试中得来的。
from pwn import *
name='/home/kali/pwnDASCTF十月赛R()P'
elf = ELF(name)
if args['REMOTE']:
p = remote('127.0.0.1', 7777)
else:
#p = gdb.debug(name,"break main")
p = process(name)
print("raed got addr= "+