pwn0
靶场环境启动开,显示ssh连接。
直接打开ctfshow的pwn专用虚拟机来使用ssh连接。密码是123456。
连接之后,他会出现这样的一大堆的介绍性文字,不用管他,然他输出完就行。
中间还用各种语言说了一下“消灭人类暴政,世界属于人工智能!”,真是可笑啊hhh
这里他说他会在3秒中关闭,让我们尽快get flag,其实就是哈牛逼啊,他不会关闭的,我们来几条命令试一下能否执行。
可以看到我们输入pwd,显示了当前路径,我们直接切到根目录,发现了ctfshow_flag这个文件,直接cat读取拿到flag!
pwn1
我们把这个pwn文件下载下来,弄到虚拟机里看一下。
它是一个可执行文件,我们需要先给它加一个执行权限。
下面我们适用checksec命令看一下它的文件信息。
这是一个64位的可执行文件,那我们就是用ida64来反编译瞄一下里面都有啥?
main函数里是这么个东西,里边有个system()函数,并且参数是"cat /ctfshow_flag"是读取flag的命令,那这样的话我们直接运行这个远程文件就可以拿到flag了,也就直接远程nc连接 pwn.challenge.ctf.show 28131这个服务器就行了。
注意啊,大家千万别直接在本地直接运行那个pwn文件,那样是拿不到flag的。因为,我们在本地运行就相当于那个system函数执行的命令是在我们自己本地虚拟机里面读/ctfshow_flag,那我们自己虚拟机怎么可能有flag嘛,当然不行的。
如果在本地直接执行pwn文件就是酱紫的!
所以我们直接nc就行。
看到没,这样才能拿到flag。
pwn2
还是先把pwn文件弄到虚拟机看一下。
它还是64位的,托到ida64反编译一下,瞅一瞅!
这次是没有"cat ctfshow_flag"的命令了,直接把交互式的shell给我们了,那都一样。只不过需要我们自己去手动读取了!
还是nc连接啊师傅们!
OK,拿到flag!
pwn3
老样子,下载pwn到虚拟机,然后看文件信息。
64位的文件,拖进ida64看反编译结果。
这是一个switch-case语句,case 6中有一个system_func()函数,我们跟进看一下。
哇哦,system_func()函数是一个读取flag的函数,不可思议。
代表我们nc连接之后会让我们输入一个选项,输入6就会执行system_func()函数,执行这个函数就会读取flag,OK,直接干!
成功拿到flag!
pwn4
老样子,下载pwn到虚拟机,然后看文件信息。
64位的,继续拖入ida64看一下里面是啥。
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s1[11]; // [rsp+1h] [rbp-1Fh] BYREF
char s2[12]; // [rsp+Ch] [rbp-14h] BYREF
unsigned __int64 v6; // [rsp+18h] [rbp-8h]
v6 = __readfsqword(0x28u);
setvbuf(_bss_start, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 2, 0LL);
strcpy(s1, "CTFshowPWN");
logo();
puts("find the secret !");
__isoc99_scanf("%s", s2);
if ( !strcmp(s1, s2) )
execve_func();
return 0;
}
使用了if语句,strcmp函数是比较两个字符串是否相等的,也就是如果s1跟s2相等,就会执行execve_func()函数,这个s2变量的内容是需要我们去输入的,我们先看一下execve_func()函数里边是什么?
哇~是个交互式shell!OK,我们nc连接之后输入s1变量的值就行,代码中适用strcpy(s1,“CTFshowPWN”);语句将"CTFshowPWN"这个字符串赋给了s1,所以我们nc连接之后输入CTFshowPWN就行了!
我们输入完回车之后,他没给任何提示消息啊,大家可能会疑惑啊,其实呢我们这时已经获得它的shell了,只是没有提示消息罢了。
那好我们执行命令来找flag吧!
成功拿到flag!