0%

pwn堆入门系列教程5

本文首发于先知社区

pwn堆入门系列教程1
pwn堆入门系列教程2
pwn堆入门系列教程3
pwn堆入门系列教程4

进入uaf学习了,这部分题目就一道题

hitcon-training-hacknote

这道题其实很简单,不过要冷静下才能做,我当时有点急躁,浪费一个钟才搞出来?冷静下来10分钟懂了

Read more »

pwn堆入门系列教程4

本文首发于先知社区

pwn堆入门系列教程1
pwn堆入门系列教程2
pwn堆入门系列教程3

序言:这次进入到unlink的学习了,unlink在第一节已经用上了,但我用起来还不是很流畅,还是去翻了第一节的笔记,最主要是指针的问题,可能没学好指针,理解了unlink后就简单做了

2014 HITCON stkof

Read more »

pwn堆入门系列教程3

本文首发于先知社区

pwn堆入门系列教程1
pwn入门系列教程2

序言:这次终于过了off-by-one来到了Chunk Extend / Overlapping,这部分在上一节也进行了学习,所以难度相对来说不会是那么大,刚起初我以为,因为第一题很简单,但做到第二题,我发觉我连格式化字符串的漏洞都不会利用,真的是太菜了,后面看了看雪大佬的文章才会做

Read more »

pwn堆入门系列教程2

本文首发于先知社区

堆入门系列教程1
序言:第二题,研究了两天,其中有小猪师傅,m4x师傅,萝卜师傅等各个师傅指点我,这次又踩了几个坑,相信以后不会再犯,第二题感觉比第一题复杂许多,不是off-by-one的问题,是这种攻击方式的问题,这种攻击方式十分精妙,chunk overlap,堆块重叠,这种攻击方式我也是第一次见,复现起来难度也是有滴

Read more »

pwn堆入门系列教程1

本文首发于先知社区

因为自己学堆的时候,找不到一个系统的教程,我将会按照ctf-wiki的目录一步步学下去,尽量做到每天有更新,方便跟我一样刚入门堆的人学习,第一篇教程研究了4天吧,途中没人指导。。很尴尬,自己一个很容易的点研究了很久才懂,把踩过的坑也总结下,方便后人不再踩坑

环境搭建

Read more »

论菜鸡pwn手如何在无网环境(ps:类似国赛)下生存

本文首发于先知社区

引言:在打完一次无网环境后,觉得没网环境实在难受,查个libc都没得查。。没准备好,那时碰巧我下了ctf-challenge,在那里碰巧弄到了libc,可能有人喜欢用libc-searcher那个py版本的项目,我不怎么喜欢,用那个导入库查找感觉较慢,还是喜欢手动泄露后到网页查找,于是有了这篇文章

Read more »

高级ROP ret2dl_runtime 之通杀详解(本文首发于先知社区)

前言:花了好几天研究这几个类型题,发觉了个通用规律,原来越高级的题目利用起来越容易,因为根本不用画太多时间改exp,直接改几个变量就可以直接打成功。。。所以想写篇文章记录下,以前怕高级rop,理解原理并利用后发觉简单了

ret2dllruntime 原理

Read more »

  1. system(“/bin/sh”)
  2. system(“sh”)
  3. system(“/bin/bash”)
  4. system(“bash”)
  5. system(“$0”)
  6. system(“x86_64”)
  7. system(“i386”)

若还不成,可试试在参数后面加;#
比如system(“/bin/sh;#”)
这是由于函数的特殊性,有些函数会截断特殊字符

Read more »

pwn-01

题目不难,很明显能看出ROP

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
26
27
28
29
30
31
32
33
34
35
36
int encrypt()
{
size_t v0; // rbx
char s[48]; // [rsp+0h] [rbp-50h]
__int16 v3; // [rsp+30h] [rbp-20h]

memset(s, 0, sizeof(s));
v3 = 0;
puts("Input your Plaintext to be encrypted");
gets(s);
while ( 1 )
{
v0 = (unsigned int)x;
if ( v0 >= strlen(s) )
break;
if ( s[x] <= 96 || s[x] > 122 )
{
if ( s[x] <= 64 || s[x] > 90 )
{
if ( s[x] > 47 && s[x] <= 57 )
s[x] ^= 0xFu;
}
else
{
s[x] ^= 0xEu;
}
}
else
{
s[x] ^= 0xDu;
}
++x;
}
puts("Ciphertext");
return puts(s);
}
Read more »

修复部分

题目出现的麻烦就是出现了gets危险函数,所以把gets危险函数去除,换成fgets或换成c++的cin即可,甚至可以加个cannary保护,因为题目本身没泄露,所以没法泄露cannary,所以溢出都不行了,cannary保护我也不记得命令,玩蛇皮,不给百度

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;
int x = 0;
void begin()
{
puts("====================================================================");
puts("1.Encrypt");
puts("2.Decrypt");
puts("3.Exit");
puts("Input your choice!");
}

void encrypt()
{
char s[48];
memset(s, 0, sizeof(s));
puts("Input your Plaintext to be encrypted");
cin >> s;
while( strlen(s) > (unsigned int)x )
{
if( s[x] <= 96 || s[x] > 122 )
{
if( s[x] <= 64 || s[x] > 90 )
{
if(s[x] > 47 && s[x] <= 57)
s[x] ^= 0xf;
}
else
{
s[x] ^= 14;
}
}
else
{
s[x] ^= 13;
}
++x;
}
s[47] = '\0';
puts("Ciphertext");
}
int main()
{
int input;
puts("EEEEEEE hh iii ");
puts("EE mm mm mmmm aa aa cccc hh nn nnn eee ");
puts("EEEEE mmm mm mm aa aaa cc hhhhhh iii nnn nn ee e ");
puts("EE mmm mm mm aa aaa cc hh hh iii nn nn eeeee ");
puts("EEEEEEE mmm mm mm aaa aa ccccc hh hh iii nn nn eeeee ");
puts("====================================================================");
puts("Welcome to this Encryption machine\n");
begin();
while(1)
{
while(1)
{
fflush(0);
scanf("%d", &input);
getchar();
if(input != 2)
break;
puts("I think you can do it by yourself");
begin();
}
if(input == 3)
{
puts("Bye!");
return 0;
}
if( input != 1 )
break;
encrypt();
begin();
}
puts("Something Wrong!");
return 0;
}
Read more »