首页 > 其他分享 >[RCTF 2022] Reverse赛题复现

[RCTF 2022] Reverse赛题复现

时间:2023-01-31 17:59:27浏览次数:54  
标签:RCTF Reverse int 赛题 len char dfs path

突然发现还没搞完,占个坑先,也不知道什么时候填上(心虚)

huowang

大概是qemu起了一个新的迷宫,然后又走了check里面那个map的迷宫,两个迷宫都得走过才算对。

学长用unicorn模拟把这玩意解出来的,但我现在还不会unicorn,只能来试试啥卵爆破解法。(寒假一定学会unicorn(确信))

直接dfs,能爆出来就行

import subprocess
import sys

map = [
    "* *********************",
	"* *     *       *     *",
	"* * * * *** * *** * * *",
	"*   * *     * *   * * *",
	"* * * ********* * *** *",
	"* * *     *     * *   *",
	"* * ***** * * ***** * *",
	"*   * *   *         * *",
	"*** * * *** * *** *** *",
	"*   * *   * * *   *   *",
	"* *** *** * * *   *** *",
	"*   * *   * * *     * *",
	"* * * * *** * ***** * *",
	"* *   *         *   * *",
	"* *********** *** * * *",
	"*   *     *       * * *",
	"* ********* ********* *",
	"*   ** ***  *       * *",
	"*   * **** ** ***** * *",
	"*   * *  *    *     * *",
	"* * * * * ***** ***** *",
	"*       *     *       *",
	"*********************E*"
]
vis = [[False for j in range(25)] for i in range(25)]
def dfs(x, y, path):
	if x < 0 or x >= 23:
		return
	if y < 0 or y >= 23:
		return
	if vis[x][y] == True:
		return
	if map[x][y] == '*':
		return
	if map[x][y] == 'E':
		file = './HuoWang'
		p = subprocess.Popen([file], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

		p.stdin.write(path.encode())
		p.stdin.close()

		result = p.stdout.read()
		p.stdout.close()
		print(result)
		if b'GrandFather' in result:
			print(path)
	vis[x][y] = True
	dfs(x - 1, y, path + 'w')
	dfs(x + 1, y, path + 's')
	dfs(x, y - 1, path + 'a')
	dfs(x, y + 1, path + 'd')
	vis[x][y] = False

dfs(0, 1, '')
print("OOOps")

结果跑出来两个解:

第一个的路径是:sssssssddwwwwwwddssssddddssaassddssaassddddwwwwwwwwddddwwddwwddddssssaassaassaassddddssaassaaaaaassassdddwwddddddssaaaassdddddds
RCTF

第二个的路径是:sssddwwddssssddddssaassddssaassddddwwwwwwwwddddwwddwwddddssssaassaassaassddddssaassaaaaaassassdddwwddddddssaaaassdddddds
RCTF

赛中给了hint是最短路,那就是第二个了

RTTT

这rust又臭又长还不给符号表,呃呃了

函数的主要逻辑在sub_EBF0中。上动调,发现两组大小为20的数据在之后的一个while循环里异或

提出来手动异或一下

v229 = [125, -12, -124, -33, 78, 49, 27, -5, 45, -26, 88, -33, 84, -108, -121, -41, -46, -43, -5, -48]
v227 = [42, -111, -24, -68, 126, 92, 126, -37, 89, -119, 120, -115, 23, -64, -63, -9, -32, -102, -55, -30]

for i in range(20):
    print(chr(v229[i] ^ v227[i]), end="")

发现是Welc0me to RCTF 2O22

接着往下调,在sub_E310里面发现了0x100和取模,以及最后一步是异或操作,可以联想到可能是RC4,那么之前的Welc0me to RCTF 2O22大概率是key,直接解密一下E310后面的42个字符发现解出来是:

C7DD9165-R-72--}332DE0CBEF9C{1776T7DF3DCEF,一眼顺序有问题。

考虑输入42位字符0123456789abcdefghijklmnopqrstuvwxyzABCDEF然后去动调映射一下,最好找的地方就是RC4最后一步异或那,肯定会有当前的密文

从0123456789abcdefghijklmnopqrstuvwxyzABCDEF变到了ozpBaxmtn0sqjdiF8fcyr57b93w14EgAD2uCk6lveh,RC4是个对称加密,那么我们开始对得到的结果也映射一下

#include <bits/stdc++.h>
using namespace std;
void init(int *s, char *key, int len)
{
	int t[256] = {0};
	char tmp = 0;
	for (int i = 0; i < 256; ++i)
	{
		s[i] = i;
		t[i] = key[i % len];
	}
	int j = 0;
	for (int i = 0; i < 256; ++i)
	{
		j = (j + s[i] + t[i]) % 256;
		swap(s[i], s[j]);
	}
}
void crypt(int *s, char *data, int len)
{
	int i = 0, j = 0, t = 0;
	char tmp;
	for (int k = 0; k < len; ++k)
	{
		i = (i + 1) % 256;
		j = (j + s[i]) % 256;
		swap(s[i], s[j]); 
		t = (s[i] + s[j]) % 256;
		data[k] ^= s[t];
	}
}
char orig[233] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEF";
char end[233] = "ozpBaxmtn0sqjdiF8fcyr57b93w14EgAD2uCk6lveh";
int pos[233];
char data[233] = {0x34, 0xc2, 0x65, 0x2d, 0xda, 0xc6, 0xb1, 0xad, 0x47, 0xba, 0x6, 0xa9, 0x3b, 0xc1, 0xcc, 0xd7, 0xf1, 0x29, 0x24, 0x39, 0x2a, 0xc0, 0x15, 0x2, 0x7e, 0x10, 0x66, 0x7b, 0x5e, 0xea, 0x5e, 0xd0, 0x59, 0x46, 0xe1, 0xd6, 0x6e, 0x5e, 0xb2, 0x46, 0x6b, 0x31};
char key[233] = "Welc0me to RCTF 2O22";
int s[260];
int main()
{
	int len = strlen(key);
	init(s, key, len);
	len = strlen(data);
	crypt(s, data, len);
	for (int i = 0; i < 42; ++i)
	{
		for (int j = 0; j < 42; ++j)
		{
			if (orig[i] == end[j])
			{
				pos[i] = j;
				break;
			}
		}
	}
	for (int i = 0; i < 42; ++i) cout << data[pos[i]];
	return 0;
}

得到flag:RCTF

rdefender

依然是rust,感谢出题人没去符号表。这个题赛中好像是个交互题,我线下复现只能大概分析一波了

main函数里会发现一个字符串叫flag,动调会报错"No such file or directory",分析一下逻辑应该是读取了叫flag的文件,动调会发现src_8保存了flag文件内的数据在内存中的地址信息

checkserver

带了个html,检查程序的时候没看出啥玩意来,字符串窗口有"[SUCCESS] Auth Success"和"[ERROR] Auth Fail"这种字符串,然后还有下面那一大串,第一反应是:这是个http服务器吗??这tm是逆向吗???

来到字符串authcookie的位置,\r\n\r\n是两个换行,联想一下,POST请求的body和header之间也是俩换行,这应该是个POST请求吧大概,大胆猜下面发了个authcookie的包(这真不是web题?)

loc_404530里面带花指令,研究了一下发现那些一大坨的数据块都是脏字节,没有任何作用,上面的jnz应该是恒为真的,把数据块全给nop掉就可以反汇编了。这里面的花指令也是一样的

402040里面看起来是个奇奇怪怪的加密,观感上是上面两个xmm里面的数据经过这个奇奇怪怪的加密后会变成下面那俩xmm,然后Auth Fail和Auth Success就是提示check是否成功的。那现在准备发包动调吧

strace ./checkserver可以检查到端口为8080

配个burpsuite先

标签:RCTF,Reverse,int,赛题,len,char,dfs,path
From: https://www.cnblogs.com/Here-is-SG/p/17080043.html

相关文章

  • C++信奥赛题目 1154:亲和数
    1154:亲和数时间限制:1000ms      内存限制:65536KB提交数:41239   通过数:24946【题目描述】自然数a的因子是指能整除a的所有自然数,但不含a本......
  • 从python列表里删除一个元素会对reversed() 产生怎样的影响
    这是一个在stackoverflow上看到的问题,非常的有趣且值得研究。1.iter使用iter函数返回列表的迭代器,随后从列表里删除一个元素,在遍历迭代器时,输出的内容会是怎样的呢?lst=['......
  • 206. Reverse Linked List[Easy]
    206.ReverseLinkedListGiventheheadofasinglylinkedlist,reversethelist,andreturnthereversedlist.Constraints:Thenumberofnodesinthelist......
  • AcWing 第87场周赛题解
    T1移动棋子算出为\(1\)的点离\((3,3)\)的距离即可。#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;intmain(){int......
  • reverse3
    查一下,无壳32位用IDA32打开直接看main_0函数int__cdeclmain_0(intargc,constchar**argv,constchar**envp){size_tv3;//eaxconstchar*v4;//eax......
  • 通过php reverse shell进入目标机的方法
    在进入目标机的服务器管理员界面后,有时候发现可以通过上传或修改php文件来进入目标机 方法有很多: 1.netcat:这是基于netcat的方法首先得有一个phpreverseshell.ph......
  • [LeetCode]7. Reverse Integer (easy)
    ​​WelcomeToMyBlog​​7.ReverseInteger(easy)1.在java中,数值溢出后还能计算,只不过得到的计算结果不正确,可以设置两个变量并利用这一点进行溢出判断2.因为......
  • 1.17模拟赛题解
    T1设\(dp_{i,j}\)前\(i+j\)个人站队,第一排站\(i\)个人的方案数。每次对相同身高的一段人进行转移。暴力复杂度是正确的。时间复杂度\(O(n^2)\)。T4考虑二分答......
  • 1.16模拟赛题解
    T1对于区间\([1,i]\)的划分方案,划分长度一定是\(i\)的因数,因此考虑暴力枚举区间长度。问题转化为快速check一段区间是不是美丽的。首先,区间内的\(-1\)一定要么......
  • 1.14模拟赛题解
    T1考虑枚举线段的中点,计算它对答案的贡献。时间复杂度\(O(nm)\)。T2首先可以计算出最大流量\(maxf=\dfrac{sum}{len}\)。那么就可以将\(k\)条路径当成一条来看。把......