学pwn/二进制逆向

[pwnable.kr]第一题fd

2020-04-10  本文已影响0人  飞速遗忘

题目

Mommy! what is a file descriptor in Linux?

ssh fd@pwnable.kr -p2222 (pw:guest)

提示使用ssh登录服务器pwnable.kr, 端口-p2222.账号fd, 密码guest

第一步:ls -l查看文件和权限,看到三个文件col col.c flag

尝试用cat flag查看flag文件,发现权限不足(其实从在从ls -l给的信息中也能看出来文件flag的权限给的很少)
第二步:查看源代码cat col.c

catcol.PNG

解题思路

system("/bin/cat flag");

根据源代码中的if语句约束, 为了到达这一步需要满足三个条件 :

  1. 至少有一个输入,即argc >= 2,因为此题只取用了argv[1],所以argc = 2即可,也就是只输入一个参数. argc代表输入的参数个数, 程序名字是一个,输入的内容是一个,共两个.
  2. 输入的参数的长度为20个字节
  3. check_password()函数的返回值等于全局变量hashcode = 0x21DD09EC
    前两个条件容易满足,只需要保持有一个输入且长度为20字节即可。
    第三个条件则需要分析check_password(const char * p)函数
unsigned long check_password(const char * p){
  int* ip = (int*) p;
  int i;
  int res = 0;
  for (i = 0; i < 5 ; i++){
    res += ip[i];
  }
  return res;
}

解题的主要目标就可确定为 : 输入20个字节的char字符, 将每4个char字符转换为1个int数字后相加,最终的结果等于0x21DD09EC

解题方法

python -c "print '\x01'*3+'\x1d'+'\x01'*2+'\x6d'+'\x01'*2+'\x05'+'\x6d'+'\x01'+'\x74'+'\x01'*3+'\x75'+'\x01'*3"
//这是python2.7的代码,注意数字的低位在前高位在后是因为主机是小端模式
./col $(python -c "print '\x01'*3+'\x1d'+'\x01'*2+'\x6d'+'\x01'*2+'\x05'+'\x6d'+'\x01'+'\x74'+'\x01'*3+'\x75'+'\x01'*3")

注意 : 输入数字的拆分原则: 不能出现0x00,会被视为分割输入参数的空格,导致输入1个参数的20字节读取后被分割为数个参数. 另外标准ascii码的的范围为0x00~0x7f, 所以分割的字节不能出现大于0x7f的,否则会在python输出字符时出现问题.

基础知识补充

大小端 :是数据存放的方式. 低地址存高位是大端, 低地址存低位是小段. 假设地址从小到大增长, 对于0x123456, 大端存储为 12 34 56, 小端存储为56 34 12
linux命令 :

python -c "print 'a'*10+'xxx'" | ./program
上一篇 下一篇

猜你喜欢

热点阅读