标签:int WriteUp unsigned long t1 char Re RCTF2021 ret
太菜了 只会做两个简单题 不过还是从这个比赛学习到挺多东西
Ghidra使用啊 位运算啊 angr IR啊什么的 感谢出题人!
Hi!Harmony!
IDA7.6反编译失败 尝试使用Ghidra成功反编译
查找字符串交叉引用找到关键的加密函数
EXP:
#include <stdio.h>
const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main() {
char str[] = { 0x48 ,0x41 ,0x52 ,0x4d ,0x4f ,0x4e ,0x59,0x44 ,0x52 ,0x45 ,0x41 ,0x4d ,0x49 ,0x54 ,0x50 ,0x4f ,0x53 ,0x53 ,0x49 ,0x42 ,0x4c ,0x45,0x0};
for (int i = 0; i < 22; ++i) {
if (a[i] < 0x58) {
a[i] = a[i] + 3;
}
else {
a[i] = table[(a[i] -0x57) % 26-1]; //注意加密所使用的表是从uStack49开始的 exp所使用的表是从uStack48开始
}
}
printf("%s", str);
return 0;
}//KDUPRQBGUHDPLWSRVVLEOH
LoongArch
附件给了一小段类似Mips架构的汇编代码和一个64bytes的output文件 通过Google搜索找到龙芯架构指令集
读懂大致逻辑后 猜测程序运行完后sp+32至sp+96的内容为output文件的内容 sp+0至sp+32的内容为flag 逐层反推即可
EXP:
#include <stdio.h>
unsigned long long bitRev8b(unsigned long long t)
{
char* pt = (char *)&t;
for (int i = 0; i < 8; ++i) {
unsigned char temp = *pt;
unsigned char ret=0;
for (int i = 0; i < 8; i++)//1byte按位逆序
{
ret <<= 1;
ret |= temp & 1;
temp >>= 1;
}
*pt = ret;
pt += 1;
}
return t;
}
unsigned long long bitRevd(unsigned long long t) //64bits按位逆序
{
unsigned long long ret = 0;
for (int i = 0; i < 64; i++)
{
ret <<= 1;
ret |= t & 1;
t >>= 1;
}
return ret;
}
int main() {
unsigned long long
t0 = 0,
t1 = 0,
t2 = 0,
t3 = 0; //flag
unsigned long long
t4 = 0,
t5 = 0,
t6 = 0,
t7 = 0;
unsigned long long
sp32 = 0x8205f3d105b3059d,
sp40 = 0xa89aceb3093349f3,
sp48 = 0xd53db5adbcabb984,
sp56 = 0x39cea0bfd9d2c2d4,
sp64 = 0xc513455508290500,
sp72 = 0x006d621abb30b918,
sp80 = 0xbc555b9f4c6f86a1,
sp88 = 0x050d78ad181a626d; //output
t0 = t1 = t2 = t3 = 0xFFFFFFFFFFFFFFFF;//~0
t4 = sp64^t0;
t5 = sp72^t1;
t6 = sp80^t2;
t7 = sp88^t3; //取反
t0 = bitRev8b(t4);
t1 = bitRev8b(t5);
t2 = bitRev8b(t6);
t3 = bitRev8b(t7);
t4 = ((t1 & 0xffffff) << 40) | ((t2 & 0xffffffffff000000) >> 24);
t5 = ((t0 & 0xffffffffff000000) >> 24) | ((t2 & 0xffffff) << 40);
t6 = ((t0 & 0xffffff) << 40) | ((t3 & 0xffffffffff000000) >> 24);
t7 = ((t1 & 0xffffffffff000000) >> 24) | ((t3 & 0xffffff) << 40); //bytepick.d
t0 = bitRevd(t4);
t1 = bitRevd(t5);
t2 = bitRevd(t6);
t3 = bitRevd(t7);
t4 = sp32;
t5 = sp40;
t6 = sp48;
t7 = sp56;
t0 ^= t4;
t1 ^= t5;
t2 ^= t6;
t3 ^= t7;
printf("%.8s%.8s%.8s%.8s", (char*)&t0, (char*)&t1, (char*)&t2, (char*)&t3);
return 0;
}//RCTF{We1c0m3_t0_RCTF_2o21_@&-=+}
标签:int,WriteUp,unsigned,long,t1,char,Re,RCTF2021,ret 来源: https://www.cnblogs.com/0xK4ws/p/15658669.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。