BugkuCTF-Reverse题NoString

知识点

我们需要知道异或(^)操作
举例:11001001^00110001=11111000
10=1;01=1;11=0;00=0异真同假
当我们得到11111000和00110001,我们怎么得到11001001?当然也是异或
11111000^00110001=11001001

C语言的9u即异或9
c语言数字后面带个U是表示无符号类型的数据。U是unsigned的首字母。如:unsigned int a = 32, b; b = 32 + 12U; // 12是一个无符号类型的数据。
U表示该常数用无符号整型方式存储,相当于 unsigned int
L表示该常数用长整型方式存储,相当于 long
F表示该常数用浮点方式存储,相当于 float
(一)用于说明数据类型
数值后面加“L”和“l”(小写的l)的意义是该数值是long型。
详细说如下:
5L的数据类型为long int。
5.12L的数据类型为long double。
数值后面加“U”和“u”的意义是该数值是unsigned型。
(二)用于说明数值表示方法
数值后面加“”H“、“h”的意义是该数值是用16进制表示的。
数值后面加“”B“、“b”的意义是该数值是用2进制表示的。
后面什么也不加,代表10进制。
栗子:
11111111B = FFH = 255
数值前面加“0”的意义是该数值是八进制。
数值前面加“0x”的意义是该数值是十六进制。

解题流程

下载得到一个exe程序,是32位的
在这里插入图片描述
大概程序逻辑就是我们输入正确的flag,就会提示正确
在这里插入图片描述
IDA打开后,字符串搜索大法shift+f12看不到什么有效信息
因为我们搜索不到字符串,所以我们考虑是被加密了,需要分析代码
F5看一下伪码
在这里插入图片描述
在这里插入图片描述
根据上面的代码分析,xx经过9u异或操作,得到了printf的内容

注意到Format里各位依次与9u异或后得到的结果可能是yelhzl)`gy|})|)oehnl3
尝试写脚本,看一下Format本来的值是什么

a = "yelhzl)`gy|})|)oehnl3"
am=""
for i in range(len(a)):
	am += chr(ord(a[i]) ^ 9)
print(am)

在这里插入图片描述
发现输出的结果正好是打开exe文件时,打印出的字符
在这里插入图片描述

那么后面某串字符肯定与输出的flag有关系,注意到后面v5赋值为1时,输出了一串l{{f{,拿去运行一下发现结果是error;而v5赋值为-1时,输出了{na},运行结果是right`。

那么说明重要的判断条件在前面,应该就是 v5 = strcmp(&v11,
aOehnl3rHfCcgpt);,找到aOehnl3rHfCcgpt对应的值oehnl3r=<?=hF@CCGPt
在这里插入图片描述
拿去跟9u异或一下,得到flag

a = "oehnl3r=<?=hF@CCGPt"
am=""
for i in range(len(a)):
	am += chr(ord(a[i]) ^ 9)
print(am)

在这里插入图片描述
得到flag

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值