pwnable-flag

pwnable-flag

答案

upx -d flag
strings flag > flag.txt | grep ":)"

题目分析

  1. 看题目信息我没太看懂,以为是被加密了的文件,就用 strings 看了一下里面的字符串,没想到歪打正着看到了UPX1,这是一个二进制文件加壳工具,他会使程序逻辑变得混乱,难以调试
  2. 然后通过 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 :)

  1. UPX介绍 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值