XCTF no-strings-attached

1.分析

XCTF no-strings-attached

32位文件,拖进ida pro分析

进入main函数
XCTF no-strings-attached

authenticate()函数中有一个decrypt函数
XCTF no-strings-attached

unk_8048B44是 success! 说明ws要和s2相同
XCTF no-strings-attached

fgets函数
char *fgets(char *str, int n, FILE *stream)
从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

  • str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
  • n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

strcmp函数
int strcmp(const char *str1, const char *str2)
str1 所指向的字符串和 str2 所指向的字符串进行比较

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。

进入descrypt()函数:s是0x143A,0x1436,0x1437... dword_8048A90是0x1401,0x1402,0x1403,0x1404,0x1405
XCTF no-strings-attached
XCTF no-strings-attached
XCTF no-strings-attached

2. exp

参照decrypt()写一个exp.py得到flag

s=[0x3a, 0x36, 0x37, 0x3b, 0x80, 0x7a, 0x71, 0x78, 0x63, 0x66, 0x73, 0x67, 0x62, 0x65, 0x73, 0x60, 0x6b, 0x71, 0x78, 0x6a, 0x73, 0x70, 0x64, 0x78, 0x6e, 0x70, 0x70, 0x64, 0x70, 0x64, 0x6e, 0x7b, 0x76, 0x78, 0x6a, 0x73, 0x7b, 0x80]
v6 = len(s)
a2 = [1,2,3,4,5]
v7 = len(a2)
v2 = v6
dest = s
v4 = 0
while v4<v6:
        dest[v4] -= a2[v4%5]
        v4+=1

flag = ''
for j in dest:
    flag+=chr(j)
print(flag)
上一篇:c语言共用体的使用和long类型长度


下一篇:ciscn_2019_sw_1(fmt劫持fini_array为main,获得一次循环)