pwnable-flag
答案
upx -d flag
strings flag > flag.txt | grep ":)"
题目分析
- 看题目信息我没太看懂,以为是被加密了的文件,就用 strings 看了一下里面的字符串,没想到歪打正着看到了UPX1,这是一个二进制文件加壳工具,他会使程序逻辑变得混乱,难以调试
- 然后通过 strings ,我突然想到 flag 都是字符串,直接 strings查找解壳的二进制文件中的字符串,再过滤包含:)的字符串,果然在上面一行找到了 flag 字符串。
调试程序
wget http://pwnable.kr/bin/flag // 获得程序文件
upx -d flag // 先把flag文件解壳
基础步骤
gdb ./flag
b main
r
layout asm // 前几篇文章都讲过就不再解释
可以发现有一个flag的注释, 我的思路是直接查看该位置的内存值
这是以字显示时的顺序
这是以字节显示的顺序,刚好每四个字节顺序相反
这段十六进制转换为assic大概率就是最终答案
由于小端序的原因,字符串以字(w)显示时,会自动转换为小端序显示
import re
def hex_to_ascii(hex_string, small=True):
hexC = re.compile("(?:0x)?([0-9a-fA-F]+)")
hex_lst = hexC.findall(hex_string)
ascii_lst = []
for hexS in hex_lst:
asciiS = []
if len(hexS) % 2:
raise ValueError("一个字节必须包含两个数字!")
for i in range(0, len(hexS), 2):
hexA = hexS[i:i + 2]
asciiA = chr(int(hexA, 16))
asciiS.append(asciiA)
if small is True:
asciiS.reverse()
ascii_lst.append("".join(asciiS))
return "".join(ascii_lst)
if __name__ == "__main__":
hexString = r"""
0x2e585055 0x203f2e2e 0x6e756f73 0x6c207364
0x20656b69 0x65642061 0x6576696c 0x73207972
0x69767265 0x3a206563 0x00000029
"""
print(hex_to_ascii(hexString))
我写了个简单的脚本进行转换,网络上应该也有转换器
这是最终结果
UPX...? sounds like a delivery service :)