[BJDCTF 2nd]8086
题目是8086,猜测与汇编代码有关系
Ida打开,直接看看汇编代码试试 View–opensubview–disassembly
发现一段字符串

往下看,下面是一个循环程序,选中它,按c选force把他强制转换成汇编。

dec是自减函数。例如:DEC AL; AL内容减1
loop指令为循环指令
mov cx,22h表示循环了22次

字符串与1fh做抑或
Python脚本

x=']U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b;'
f=''
for i in x:
f+=chr(ord(i)^0x1F)
print(f)
运行结果

Flag:BJD{jack_de_hu1b1an_xuede_henHa0}
[GKCTF2020]Check_1n


需要开机密码
Ida打开shift f12

找到这个 hello world即为开机密码,输入开机密码

选择flag

像是base64加密,解密
选择打砖块


Flag:flag{f5dfd0f5-0343-4642-8f28-9adbb74c4ede}
后来了解

这一串字符为base58加密 解密可得出flag
[GXYCTF2019]luck_guy


进入patch_me

进入get_flag


从第21行可以知道f1= GXY{do_not_

但是f2的值还是空的
Case4给f2赋值9180147350284624745LL
Case5给f2做了处理
所以得到flag的顺序为case4>case5>case1.
写脚本

#include <stdio.h>
#include <string.h>
int main()
{
char f2[] = { 0x69,0x63,0x75,0x67,0x60,0x6f,0x66,0x7f,0 };
for (int i = 0; i < 8; i++)
{
if (i % 2 == 1)
f2[i] -= 2;
else
f2[i] -= 1;
}
char f1[] = "GXY{do_not_";
char flag[20];
memset(flag, 0,20); //memset函数
strcat(flag, f1);
strcat(flag, f2);
puts(flag);
return 0;
}

Flag:GXY{do_not_hate_me}
本文详细解析了三个CTF挑战,涉及8086汇编代码分析,通过IDA查看和理解循环程序,找到字符串与1FH做抑或的操作,得出BJDCTF的flag。接着是GKCTF2020的开机密码解密,通过IDAS搜索找到hello world作为密码,解密Base64获取flag。最后是GXYCTF2019的解谜,通过分析脚本逻辑,确定flag的生成顺序,得出GXYCTF的flag。
608

被折叠的 条评论
为什么被折叠?



