0x01 packer

elf的upx打包,我用windows的upx解不出来,开了个虚拟机在linux下就可以解包了,一开始就有flag串,十六进制转一下字符串就得到了。

picoCTF{U9X_UnP4ck1N6_B1n4Ri3S_1a5a3f39}

0x02 FactCheck

cpp程序,反编译出来很多很长,看了一下逻辑就是创建很多个字符变量,然后根据最后的逻辑按一定顺序的将这些字符append到半成品flag上,耐心看看就好了。

picoCTF{wELF_d0N3_mate_2394047a}

0x03 WinAntiDbg0x100

介绍说是一个反调试,点进去我感觉是这个阻碍我调试了,被调试时这个函数返回result=1,外部有个if接收了这个1后会导致程序退出,我们单步调试时在外部那个if前停下,然后修改ZF标志位,就能使程序跑向解密的二进制文件的代码了,直接查看内存里的密文就能得到flag。

image-20240314112708882

picoCTF{d3bug_for_th3_Win_0x100_e70398c9}

0x04 Classic Crackme 0x100

elf程序用ida打开后是一串50个字符串的有与运算和位移运算的加密代码,总共加密三轮,每轮算出一个参数,我在脚本里命名为temp,是random2和secret3得出来的,然后每轮明文加这个temp再模26,我在脚本里直接写成加3倍temp模26,等价的。

代码里用0-25代替a-z,得先把密文转化成数字格式,最后再转化成字母格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
enc = "mpknnphjngbhgzydttvkahppevhkmpwgdzxsykkokriepfnrdm"
enc1 = []
for i in range(len(enc)):
enc1.append(ord(enc[i])-97)
i = 0
secret1 = 0x55
secret2 = 0x33
secret3 = 0xF
fix = 97
flag = ""
for j in range(len(enc1)):
random1 = (secret1 & (j % 255)) + (secret1 & ((j % 255) >> 1))
random2 = (random1 & secret2) + (secret2 & (random1 >> 2))
temp = (random2 & secret3) + (secret3 & (random2 >> 4))
for k in range(0,26):
if (k + 3*temp) % 26 == enc1[j]:
flag += chr(k+97)
print(flag)
#mmhhkjbakavyaqprqnpbuygdymyyddkratrjsbbceizsgtbcxd

开个kali虚拟机连接靶机,就能得到flag了。

e7addc20847c375ec7ee3b052729983

picoCTF{s0lv3_angry_symb0ls_ddcc130f}

0x05 weirdSnake

这题打开是一个二进制文件,然后用010editor打开发现是python字节码,python字节码类似于在python的虚拟机里执行的代码,各种操作码的详情可以见中文官网

LOAD_CONST是入栈,然后STORE_NAME是把栈顶元素赋值给key_str,LOAD _NAME是把key_str入栈。分析下图的过程,尝试翻译成简单的过程。(这里的BINARY_ADD均指str重载的加法,即字符串拼接)

image-20240314201406973

1
2
3
4
5
6
7
8
key = "t_Jo3" 
enc = [4,54,41,0,112,32,25,49,33,3,0,0,57,32,108,23,48,4,9,70,7,
110,36,8,108,7,49,10,4,86,43,106,123,89,87,18,62,47,10,78]
flag = ""
for i in range(len(enc)):
flag += chr(ord(key[i % 5]) ^ enc[i])
print(flag)
#picoCTF{N0t_sO_coNfus1ng_sn@ke_516dfaee}

0x06 WinAntiDbg0x200

和第一题dbg一样的做法,直接调试进去就好了。

picoCTF{0x200_debug_f0r_Win_c6db2768}

0x07 WinAntiDbg0x300

升级版,进入主程序,在开头处下个断点一步步调试,进如图下面的函数,f7进入,这个是判断你有没有用管理员启动该程序的函数,进去后通过改ZF标志位绕过检测。

image-20240314194216397

接着往下调试,这里有个创建线程的函数,进去下个断点,f9跑进去。

image-20240314194347174

进去后发现下面有个You got flag的字符串,直接跑进去!!!!!看看图形化界面就弹出了flag窗口。

image-20240314194444698

picoCTF{Wind0ws_antid3bg_0x300_09b94ee8}