x2658y's Blog

杂七杂八的记事本

下载下来发现文件不是exe, 先IDA看一下, 发现不是PE文件

image-20220121202632787

直接分析F5看伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int __cdecl main(int argc, const char **argv, const char **envp)
{
int i; // [rsp+2Ch] [rbp-124h]
char __b[264]; // [rsp+40h] [rbp-110h] BYREF

memset(__b, 0, 0x100uLL);
printf("Input your flag:\n");
get_line(__b, 256LL); //将输入的字符串保存到__b数组中
if ( strlen(__b) != 33 ) //输入的字符串必须长33字节(不含尾部'\0')
goto LABEL_7;
for ( i = 1; i < 33; ++i )
__b[i] ^= __b[i - 1]; //输入字符串的每后一位与前一位的异或
if ( !strncmp(__b, global, 0x21uLL) ) //将异或后的结果与global这个字符串相比较
printf("Success");
else
LABEL_7:
printf("Failed");
return 0;
}

这这题需要用到一个知识点, 异或(XOR)两次会还原

1
2
101011 XOR 111111 = 010100  //101011111111异或
010100 XOR 111111 = 101011 //将异或所得结果再次与111111异或即可还原原文

所以只需要把global指向的字符串按照题目的方式再次进行一次异或即可得到原文, 原文应该就是flag

可以在IDA里使用shift+e提取字符数组

image-20220121205312277

解密代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdio>

using namespace std;

int main()
{
unsigned char ciphertext[] =
{
0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11,
0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F,
0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F,
0x47, 0x32, 0x4F, 0x00
};
for (int i = 32; i >= 1; i--)
ciphertext[i] ^= ciphertext[i - 1];
printf("%s", ciphertext);
}
//flag{QianQiuWanDai_YiTongJiangHu}

直接打开, 让输flag, 随便试一下

image-20220120234044392

首先D.I.E查壳

D.I.E查壳工具: Github

image-20220120232650513

可见是UPX壳, 就不上脱壳机了, 上x32dbg手工脱壳

image-20220120234405168

从入口往上翻能看到pushad, 一般UPX壳的的pushadpopad隔得不远, 往下翻就能找到,也可以使用堆栈平衡法(esp定律法)来找popad

image-20220120234745819
image-20220120235818368

跟到0x401280里, 看起来没问题, 尝试脱壳, 使用Scylla插件

image-20220121000101326

OEP设置为0x401280再IAT Autosearch, 再get import, 一切正常, dump出exe, 再fix dump刚导出的exe

image-20220121000248577
image-20220121000337291

尝试打开, 正常运行, 说明脱壳成功

image-20220121000655406

再用D.I.E查看, 已经无壳了

image-20220121000749537

拖进IDA分析, F5查看伪代码, 就是比较输入与字符串"HappyNewYear!", 所以flag应该就是flag{HappyNewYear!}image-20220121001208743

验证, flag正确

image-20220121001339364

惯例, 用dirsearch扫描一下, 扫到个index.php.bak

dirsearch项目地址: Github

image-20211106235918753

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
include_once "flag.php";

if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}
?>

审计代码, 当$key为数字且与$str弱相等的时候即可显示出flag

php弱类型比较:

1
2
3
4
5
6
7
8
字符串和数字比较使用==时,字符串会先转换为数字类型再比较
var_dump('a' == 0);//true,此时a字符串类型转化成数字,因为a字符串开头中没有找到数字,所以转换为0
var_dump('123a' == 123);//true,这里'123a'会被转换为123

var_dump('a123' == 123);//false,因为php中有这样一个规定:字符串的开始部分决定了它的值,如果该字符串以合法的数字开始,则使用该数字至和它连续的最后一个数字结束,否则其比较时整体值为0。
举例:
var_dump('123a1' == 123);//true
var_dump('1233a' == 123);//false
image-20211109164631082
0%