攻防世界easyre-153做法()

本文介绍了如何使用IDA工具对包含壳层的程序进行分析,包括UPX脱壳、管道和fork函数的理解,以及如何通过阅读汇编代码,特别是使用NOP指令和IDA的同步功能来找出隐藏的算法,最终解密得到flag。
摘要由CSDN通过智能技术生成

下载附件后,进行查壳如下,仔细一看,有壳,那就脱壳喽,这个是upx脱壳(上篇文章有upx脱壳教程,这边就不解释了),脱完

壳后,拖进ida32中找到main函数,然后进入,这边需要了解一下pipe函数,fork函数的运用,这边我按我的理解解释一下,pipe函数是创造一个管道,用于父进程与子进程之间的通信,fork函数是创造一个子进程,write函数是写入字符串,read函数是读取字符串,pipedes[1]代表打开写入口,pipedes[0]代表打开读入口,write(pipedes[1],字符串,0x1Du)相当于是写入字符串的前0x1Du位(先存储一下),然后read(pipedes[0],数组,0x1Du)将刚才写入的字符串读取0x1Du位赋值给该数组,一般找这两个函数就行,其他的可以忽略了,那这边,根据这两个函数,就可以知道数组buf了,然后我们进入lol函数,看看里面是对该数组怎么操作的进去之后发现只有一句话,显然不对劲,应该是有部分汇编语言没有反编译过来,我们这边右击,如图所示,使用ida的同步功能,然后在这个函数界面,按tap,再按空格,就转换为汇编语言了绿色的部分代表是该函数的汇编语言,一看竟然这么多,显然不可能就是那么一句话,那我们一句话一句话慢慢分析,然后就发现问题了,在最后,mov [ebp+var_c],0代表给[ebp+var_c]赋值为0的意思,然后下面一句话,又拿他和1进行比较,那这不是必然性跳跃吗?显然不对,那接下来只要跳过这条命令就行了,在这一行,右击,选择nop然后我们再进入这个函数,f5转换为c语言,算法就出来了,这边的a1数组,就是上方已知的buf数组,最后写个代码,就得出flag了


#include<stdio.h>
int main() {
	char a1[] = "69800876143568214356928753";   //buf数组
	int v2[7];
	v2[0] = 2 * a1[1];
	v2[1] = a1[4] + a1[5];
	v2[2] = a1[8] + a1[9];
	v2[3] = 2 * a1[12];
	v2[4] = a1[18] + a1[17];
	v2[5] = a1[10] + a1[21];
	v2[6] = a1[9] + a1[25];
	for (int i = 0; i < 7; i++) {
		printf("%c", v2[i]);
	}
	return 0;
}

最后的最后,最重要的一点,要加上一个头RCTF{},提交一下就对了,这边我们需要学会两个知识点,一个是分析汇编代码,学会用nop指令,跳过那些必然跳跃点,第二个是学会用ida的同步功能,绿色部分就是该函数所对应的汇编语言,(觉得写得好,可以给个赞鼓励一下我哦^_^)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值