开启靶场,下载附件,解压之后得到:


打开wordy文件发现是一堆乱码:


但是前面是个ELF头,很明显的二进制文件:

放到kali中跑一下看看什么情况:

呃呃,权限不够,看来还是得逆向哈


用Exeinfo PE查一下,发现无壳:


用IDA打开

shift+F12:

发现没有关键词flag


那就随便点一个,往下拉拉到main函数的地方,发现有花指令:

可以看到标红的这段有一段代码

这是一种常见的花指令

什么是花指令?

一句话概括就是构造一个恒成立条件跳转,并在中间塞一段乱七八糟的数据


打开Script command

startaddr=0x1135
endaddr=0x3100
for i in range(startaddr,endaddr):
    if get_wide_byte(i)==0xEB:
        if get_wide_byte(i+1)==0xFF:
            patch_byte(i,0x90)

这段脚本会遍历从startaddr到endaddr范围内的字节,检查是否有连续的0xEB 0xFF字节序列,并将其替换为0x90。90也就是nop的机械码,以达到去除花指令的目的


运行之后,页面发生变化,仔细观察可以看到竖着的GFCTF{这种明显的flag格式:

成功得到flag:

GFCTF{u_are2wordy}

改成NSSCTF的格式:

NSSCTF{u_are2wordy}


总结一下思路:

用IDA打开之后,页面如下:


shift+F12进入Strings标签:

随便点一个就行,因为都找不到关键词flag和main


本题的花指令就在main函数内,导致其无法被IDA识别,也就无法从函数窗口搜索


此时需要使用【内存数据搜索法】,在IDA中使用菜单栏的搜索项,选择文本,再文本中输入main

注意,main会在程序的多处被使用,所以直接搜索“下一个文本(CTRL+T)”功能,找到main函数为止比较好点

不过这种情况只适用于“main函数在被花时仍能被IDA识别到”的情况

还有一种方法,对于简单的程序而言,由于知道存在花指令(或者猜测存在花指令),所以直接将光标移动IDA上端彩色导航栏的棕红色部分,有一定几率可以看到被花指令祸害的函数


后面就是上脚本清除花指令了:


另类解法:

Ctrl T关键词查找“{”符号:

一样得到flag:

{u_are2wordy}

更多推荐