0%

WP: [BSidesSF 2020]strace-me

2025-01-19 01:24By
soknown
REVERSE

Problem: [BSidesSF 2020]strace-me

Tags

相比Reverse题,本题更是Misc题。

Steps

题目提示使用strace。因此重点关注系统调用。

使用strace

由于大部分Linux系统已经使用x86_64,程序无法直接执行。不妨执行以下设置。

sudo apt install gcc-multilib

此时即可执行strace。关注到系统调用的第一个参数的值似乎有特殊含义,且后续参数的值为0x80808080或2155905152(两者相等,取决于显示进制)。提取第一个参数的值解码为ASCII即可。

正经分析

如果注意力涣散,可以正经开展分析。不难发现有以下逻辑。

v1[1] = syscall_4040[v0 % 126]; v1[6] ^= 0x55u; v1[7] ^= 0x55u; v1[8] ^= 0x55u; v1[9] ^= 0x55u;

配合以下代码,不难理解这段代码随机选取系统调用编号并解密参数的值,解密方法为异或。

0000 B8 00 00 00 00 mov eax, 0 0005 BB ?? ?? ?? ?? mov ebx, ????????h 000A B9 80 80 80 80 mov ecx, 80808080h 000F BA 80 80 80 80 mov edx, 80808080h 0014 BE 80 80 80 80 mov esi, 80808080h 0019 BF 80 80 80 80 mov edi, 80808080h 001E CD 80 int 80h

简单编写脚本可解,参见附件。

Scripts

import re with open("strace-me", "rb") as f: x = f.read().hex(" ") m = re.findall( r"b8 00 00 00 00 " # mov eax, 0 + r"bb (.. .. .. ..) " # mov ebx, ????????h + r"b9 80 80 80 80 " # mov ecx, 80808080h + r"ba 80 80 80 80 " # mov edx, 80808080h + r"be 80 80 80 80 " # mov esi, 80808080h + r"bf 80 80 80 80 " # mov edi, 80808080h + r"cd 80", # int 80h x, ) t = bytes.fromhex(" ".join(m)) for i in range(0, len(t), 4): for j in range(4): print(chr(t[i + 3 - j] ^ 0x55), end="") print()
还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有
加载失败
广告
×
评论区
添加新评论