re学习笔记(33)HGAME2020-re-Level-Week2- unpack

HGAME2020-re-Level-Week2- unpack
新手一枚,如有错误(不足)请指正,谢谢!!

个人博客:点击进入
参考资料:从正在运行的Linux进程中dump出内存内容

题目描述

描述
看起来是upx呢,但是怎么办呢?

题目地址 http://q4f83ppqy.bkt.clouddn.com/unpack_00b2bb661b
• 完成人数 : 41
• 分数: 150

分析题目

elf文件,用IDA手动脱壳未成功,使用gdb来dump文件的内存

先运行程序
re学习笔记(33)HGAME2020-re-Level-Week2- unpack_第1张图片
再打开另一个终端,先查看进程的PID
命令:ps -elf | grep unpack
re学习笔记(33)HGAME2020-re-Level-Week2- unpack_第2张图片
然后cat一下它的内存段
命令:cat /proc/PID/maps
re学习笔记(33)HGAME2020-re-Level-Week2- unpack_第3张图片
之后用gdb载入进程(使用管理员权限)
命令:gdb attach PID
re学习笔记(33)HGAME2020-re-Level-Week2- unpack_第4张图片
再用gdb将程序内存dump出来
命令:dump memory /路径/文件名.dump 0x内存地址始 0x内存地址终
在这里插入图片描述
然后拖到IDA进行分析
re学习笔记(33)HGAME2020-re-Level-Week2- unpack_第5张图片
发现只进行了个字符串比较,双击进去查看内存存放数据,发现全为0,没有被dump出来
re学习笔记(33)HGAME2020-re-Level-Week2- unpack_第6张图片
所以我们用gdb查看一下这个内存地址存放的东西
re学习笔记(33)HGAME2020-re-Level-Week2- unpack_第7张图片

格式: x /nfu
说明
x 是 examine 的缩写
n表示要显示的内存单元的个数
——
f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。
——
u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节

写出脚本,计算出flag

#include 
#include 
int main()
{
	char flag[] = { 0x68,0x68,0x63,0x70,0x69,0x80,0x5b,0x75,0x78,0x49,0x6d,0x76,0x75,0x7b,0x75,0x6e,0x41,0x84,0x71,0x65,0x44,0x82,0x4a,0x85,0x8c,0x82,0x7d,0x7a,0x82,0x4d,0x90,0x7e,0x92,0x54,0x98,0x88,0x96,0x98,0x57,0x95,0x8f,0xa6,0x00,0x00,0x00,0x00,0x00,0x00
	};
	for (int i = 0; i < 42; i++)
		printf("%c", flag[i]-i);
}

flag为hgame{Unp@cking_1s_R0m4ntic_f0r_r3vers1ng}

你可能感兴趣的:(ctf小白成长ing,#,reverse)