no-strings-attached

在这里插入图片描述
1.下载附件并查壳
在这里插入图片描述
32位且是elf文件
2.用ida32位打开
(1)找到main函数,并查看字符串
在这里插入图片描述
无可用信息
3.f5生成伪c代码

在这里插入图片描述
当跟进最后一个时发现重要信息
在这里插入图片描述
如果s2和ws相等就—跟进
在这里插入图片描述
成功。
然而s2是dword_8048A90被decrypt加密之后的产物,
法一: 分析decrypt这个函数
思路:跟进decrypt然后分析它的运算逻辑,然后,自己写脚本,得到最后的flag
在这里插入图片描述
提取这些s和dword_8048A90的数据(shift+e)
这里引用一位大佬的话

得到 s 和 a2(即dword_8048A90) ,经过计算(相减)就能得到 dest ,即为 s2 。
目标程序是 32 位 Ubuntu ,所以 wchar_t 表示 \0 占 4 字节,后面 4 个是截止符,不代入计算

脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
int main() {
unsigned char s[] = {
58, 20, 0, 0, 54, 20, 0, 0, 55, 20,
0, 0, 59, 20, 0, 0, 128, 20, 0, 0,
122, 20, 0, 0, 113, 20, 0, 0, 120, 20,
0, 0, 99, 20, 0, 0, 102, 20, 0, 0,
115, 20, 0, 0, 103, 20, 0, 0, 98, 20,
0, 0, 101, 20, 0, 0, 115, 20, 0, 0,
96, 20, 0, 0, 107, 20, 0, 0, 113, 20,
0, 0, 120, 20, 0, 0, 106, 20, 0, 0,
115, 20, 0, 0, 112, 20, 0, 0, 100, 20,
0, 0, 120, 20, 0, 0, 110, 20, 0, 0,
112, 20, 0, 0, 112, 20, 0, 0, 100, 20,
0, 0, 112, 20, 0, 0, 100, 20, 0, 0,
110, 20, 0, 0, 123, 20, 0, 0, 118, 20,
0, 0, 120, 20, 0, 0, 106, 20, 0, 0,
115, 20, 0, 0, 123, 20, 0, 0, 128, 20,
0, 0,
};
unsigned char a2[] = {
1, 20, 0, 0, 2, 20, 0, 0, 3, 20,
0, 0, 4, 20, 0, 0, 5, 20, 0, 0,
};
int v4 = 0;
int v6 = sizeof(s) / sizeof(unsigned char);
int v7 = sizeof(a2) / sizeof(unsigned char);
while (v4 < v6) {
for (int i = 0; i < v7 && v4 < v6; ++i) {
printf("%c", s[v4++] - a2[i]);
}
}
return 0;
}

flag: 9447{you_are_an_international_mystery
法二: 动态调试
思路:数据在执行程序中就计算好了,我们直接读取
在这里插入图片描述b 表示下断点,gdb 中可以直接用已知函数名下断点,也可通过*指定地址下断点。
r 表示程序运行,n 表示单步步过,s 表示单步步入
x 指令表示查看寄存器内容,参数/s 表示用字符串形式显示,/w 表示四字节宽,/sw 表
示字符串显示,四字节宽

总结: 这道题是我第一次接触动态调试,所以在gdb这一步花了很长时间,在kali安装gdb老是出错,问恩师之后发现Ubuntu自带gdb,于是开始捯饬Ubuntu,经过多次错误,多次上网查询,多次问恩师,解决了出现的问题,这样也算为以后动态调试打下基础。

在使用ubuntu出现的问题
1:屏幕小 (安装vmtool)
2:权限不够 (网上有教程)
3:路径不能有中文名
4:chmod命令使用