【CTF Reverse】XCTF GFSJ1100 easyre-xctf Writeup(UPX壳+脱壳+反汇编+字符串搜索+小端存储)
easyre-xctf
龟缩起来,保护自己
解法
拖进 DIE 分析,发现加了 UPX 壳。
用 upx 脱壳。
upx -d easyre.exe
用 IDA 打开。
按 F5 反编译,没找到 flag。
int __fastcall main(int argc, const char **argv, const char **envp)
{_main();puts("Very easy upx!");puts("Then flag?");system("pause");return 0;
}
按 Shift + F12 打开字符串页,找到疑似半截 flag。
d_0n3_4nd_tw0}
有 part2 就有 part1。搜索一下 f_part1,没有找到,再搜 part1。
__int64 part1(void)
{return 0x5850557B67616C66i64;
}
将返回值显示为 char 类型,取得前半截 flag。
__int64 part1(void)
{return 'XPU{galf';
}
提交 flag,不对。
XPU{galfd_0n3_4nd_tw0}
查看汇编代码,发现返回前拼接了 ‘n4_’,反编译的时候可能被 IDA 漏掉了。
再次提交 flag,还是不对。
XPU{galfn4_d_0n3_4nd_tw0}
观察 flag 格式,发现 flag 拼成了 galf,UPX 拼成了 XPU。将拼接前的每段字符串分别翻转再拼接即可。
Flag
flag{UPX_4nd_0n3_4nd_tw0}
原理
下面是计算机组成原理复习时间。
x86 架构采用小端方式存储,最低有效字节(LSB)放在低地址。
前半截 flag 作为64位的整数常量(__int64)存储,而不是以常规的字符串方式存储,所以倒过来了。
__int64 part1(void)
{return 0x5850557B67616C66i64;
}
声明
本博客上发布的所有关于网络攻防技术的文章,仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶机上进行,并且严格遵守了相关法律法规。
博主坚决反对任何形式的非法黑客行为,包括但不限于未经授权的访问、攻击或破坏他人的计算机系统。博主强烈建议每位读者在学习网络攻防技术时,必须遵守法律法规,不得用于任何非法目的。对于因使用这些技术而导致的任何后果,博主不承担任何责任。