攻防世界happyctf做法(xdbg分析)

首先查个壳,

无壳,32bit,那就丢进先ida32中进行反编译,然后进入main函数分析一看代码太多了,而且函数也很多,那就只能直接凭感觉找了,先看到那一个字符串v6,肯定关键,然后我们再看到if条件,外面有个大的if条件,v12位数是否为24,else为not  enough 不够的意思,猜测flag位数为24位,然后也挺难看出什么其他的来了,那就丢进xdbg32中看看接下来我们要考虑在哪打上断点,这时候先返回ida中,找到if ( sub_405DE0(v12) == 24 )这一句话,然后在这句话末尾的空白处点一下,按tap键,进入汇编界面,最左侧有汇编地址,ctrl+c复制一下,然后返回xdbg中,ctrl+g输入地址,进入,在最左侧打上断点如图操作,红色代表已经打上了断点,好,那么好,接下来,我们直接运行(下图中方向朝右的箭头代表运行),然后会弹出黑框,这时,我们输入24个a,然后回车这个时候,按f8,单步走,然后我们会发现这是一个循环,对应ida中的那个小while循环,如下图

接下来,我们对这里面分析一手,顺便教几个简单的汇编知识点,如下图其中指令cmp代表比较的意思,jmp代表跳转的意思,call代表引用函数的意思,lea的意思是将右边值的复制给左边,可以近似看作是mov的用法吧,push就是出栈,add  eax,1等同于eax=eax+1,je代表相等跳转,差不多就这些吧,那了解了这些,这边就不难看懂了,这里面大概就一些比较,赋值等等,这里面有一个关键点,push eax后(压栈),获得了单个数据,然后call(引用)一个函数,发现每次循环都是这样,那我们进入这个函数看看,同样也是在ida中复制地址,在xdbg中跳转,找里面对eax的处理和一些关键点,xor  eax,14  一个异或处理,下一句也很关键,是将eax的低位复制到一个地方,相当于是存储异或之后的数据,再往下看,也有一个函数引用,点进去看看没啥东西,跳过就行,那么这边的主逻辑就是一个异或处理,当这边的循环结束后,我们再往后运行,00406974对应ida中的if条件,此函数的返回值不能为1,我们在xdbg中进入这个函数看,让其返回值为0,关键点在这,cmp eax,ecx 一个是我们输入进去数异或后的结果,另一个是已知数组,这边将两者作比较,相等跳转到D7,不相等就继续向下运行,跳转到E6,再返回上一界面  test异或两个ecx,不相等为1,相等为0,然后判断是否跳转,我们理一下整个的逻辑,我们输入进去的数,进入一个函数异或处理一下,然后进入另一函数,与一数组进行比较,然后在判断是否跳转,整体逻辑大概就这样,那么接下来写个代码


#include<iostream>
using namespace std;
int main()
{
	char str[]="rxusoCqxw{yqK`{KZqag{r`i";
	for(int i=0;str[i]!=0;i++){
		str[i]^=0x14;
		cout<<str[i];
	}
	return 0;
}

第一次用xdbg做题,给我的感觉有点难,可能是汇编底子太薄了,所以很多地方不是特别能理解,结合ida的代码才好理解,也是在网上看了别人的wp才慢慢理解的,如有写的不好地方,欢迎评论指出,我也希望能从大佬们身上得到建议与指点^_^

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值