[HNCTF 2022 Week1]Little Endian 超详细WP

11 阅读3分钟

Problem: [HNCTF 2022 Week1]Little Endian

前言:本蒟蒻第一篇wp,有什么不足之处还多请师傅们评论区指出。 Meanwhile,希望能帮助更多的RE初学者(此处初学者也包括我)了解到这个题目的文字思路!看完这则wp后应该就差不多能看懂其他的师傅写的wp下的代码了。

1.将文件拖入ida,F5查伪代码

Snipaste_2026-02-14_13-46-52.png

如果不是这个界面的话记得在左边找到main函数。

Snipaste_2026-02-14_13-47-51.png

2.双击点进enc[i]

初步阅读代码,我们得知:输入的数字只有和 (enc[i] ^ 0x12345678) 相等才能输出you are right!,也就是得到本题flag。所以我们点进去看看

Snipaste_2026-02-14_13-35-39.png

点进去后是这样的

Snipaste_2026-02-14_13-55-22.png

所以我们大概了解就是这六个16进制数与0x12345678进行异或

2.1不了解小端储存的话也可以做,我们可以先异或一下,再一步步往后走

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int arr[6]={0x51670536,0x5E4F102C,0x7E402211,0x7C71094B,0x7C553F1C,0x6F5A3816};
	for(int i=0;i<6;i++){
		cout<<hex<<(arr[i]^0x12345678)<<' ';
	}
}

得到的结果是这样的

Snipaste_2026-02-14_14-08-27.png 将这串数两两分组转字符的话,就能得到这串结果。(这个代码比较💩我做完这个题的时候也没想着完善,有空再说吧)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int arr[24]={0x43,0x53,0x53,0x4e,0x4c,0x7b,0x46,0x54,0x6c,0x74,0x74,0x69,0x6e,0x45,0x5f,0x33,0x6e,0x61,0x69,0x64,0x7d,0x6e,0x6e,0x6e};
	for(int i=0;i<24;i++)
	{
		cout<<char(arr[i]);
		if((i+1)%4==0)//这里主要是为了更清楚直观的看到一开始的六个十六进制数分别变成了什么
		cout<<' ';
	}
}

得到的结果是这样 Snipaste_2026-02-14_14-15-12.png 如果你有很强大的观察能力的话你就会注意到把每组字符分别倒序再组合起来的话就能得到本题的flag!

NSSCTF{Littl3_Endiannnn}

但是你是否会疑惑本题的考点是什么 为什么需要倒序再得到flag?

这时候就要学习一下小端顺序,也就是本题题目Little Endian这个东西了。

2.2(可能是)正确的解法

1.一点点前置知识

首先要了解字节顺序:在十六进制数中,靠近左边,字节越高,越靠近右边,字节越低

小端顺序就是最低有效字节放在第一个内存地址中,也就是从最右边放数。

所以,在内存的字节码中看到的其实就是以两个数为一组的、实际上与放数顺序相反的序列

用点击enc[0]后找到内存中存放的51670536h举例的话,这个实际的输入顺序就是36056751h!

2.还往下看什么呀,自己做一遍去吧

然后你就明白这个题为什么直接xor完后是那样的顺序,以及那么多wp提供的代码是什么意思了。

3.运行一下exe

Snipaste_2026-02-14_15-24-51.png ok!