从汇编生成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 […]

pwnable.kr-input

题目描述: Mom? how can I pass my input to a computer program? ssh [email protected] -p2222 (pw:guest) 连接上ssh后,input.c的源码如下: 这题代码显而易见并没有需要溢出的地方,这里考察的是unix下的数据传输,我们分别看下5个stage。 Stage1 需要通过argv传递参数,由于这里需要满足argv[‘A’]=”\x00″ argv[‘B’]=”\x20\x0a\x0d”,这些都是不可见字符,并且是空字符以及回车换行符,所以这里不能够使用python通过命令行传递参数,这里使用C语言编写程序,通过子进程的方法调用input程序进行传参 Stage2 这里我们又遇到read函数了,在pwnable.kr的第一题中就涉及到:pwnable.kr-fd 当fd为0时,为stdin ,fd为1时,为stdout,fd为2时,为stderr, 所以这里我们使用fork创建子进程,pipe进行管道传输,具体见下面的代码 Stage3 stage3使用env传递参数,env是标准main函数三个参数中的一个,它的值是系统环境变量,默认是不需要填写的。这里我们需要通过设定env=”\xde\xad\xbe\xef=\xca\xfe\xba\xbe” ,然后通过execve(“/root/Desktop/input”, argv, env);进行传递 Stage4 需要在文件名为”\x0a“的文件中读取字符,判断是否为”\x00\x00\x00\x00″,这里直接把源代码中的读取文件改成写文件就可以了: Stage5 socket编程,同样和4一样,只要把接受改成发送就可以了,这里需要注意的是socket的端口是通过argv[‘C’]来控制的,所以我们需要设置好argv[‘C’],然后在执行第五部之前需要有一个延时,因为这里我们需要时间完成第四部不同进程间的通信: 所以最后的代码为: 这里不要忘了添加文件头,然后我们把代码放到pwnable.kr服务器上的/tmp/input目录,由于目录下并没有flag,我们执行ln /home/input/flag flag,把flag重定向到当前目录下,最后编译运行得到flag: Just give me correct inputs then you will get the flag 🙂 Stage 1 clear! Stage […]

pwnable.kr-random

题目描述: Daddy, teach me how to use random value in programming! ssh [email protected] -p2222 (pw:guest) 其中random.c的代码为: 代码很简单,一开始以为是需要通过key溢出覆盖random的值,结果经过调试发现每次random()生成的数值是固定的,因为在本题的代码中并没有制定随机数种子(seed),导致每次生成的第一个数都是固定的。 第一个数为:0x6b8b456,最后的结果要求是(key ^ random) == 0xdeadbeef, 所以key的值应该为:0xdeadbeef^0x6b8b4567=3039230856 输入之后,获得flag: [email protected]:~$ ./random 3039230856 Good! Mommy, I thought libc random is unpredictable… 所以flag为: Mommy, I thought libc random is unpredictable…

pwnable.kr-passcode

依然是题目描述: Mommy told me to make a passcode based login system. My initial C code was compiled without any error! Well, there was some compiler warning, but who cares about that? ssh [email protected] -p2222 (pw:guest) 连上后,目录下有c源码和可执行文件, 首先查看下程序开了那些防护措施: gdb-peda$ checksec CANARY : ENABLED FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : Partial 这里开启了canary,所以我们只能够利用一次任意内存写的功能,无法通过写入shellcode […]

pwnable.kr-bof

首先还是题目描述: Nana told me that buffer overflow is one of the most common software vulnerability. Is that true? Download : http://pwnable.kr/bin/bof Download : http://pwnable.kr/bin/bof.c Running at : nc pwnable.kr 9000 给了c的源文件还有编译好的elf文件,c源码为: 很明显,根据注释,在gets函数的地方进行栈溢出,将key的数值覆盖为0xcafebabe,那么接下来需要计算出key和overflowme的地址差。一开始看到提供的elf文件,我觉得没有用,因为给了c源码,完全可以自己编译。现在知道编译完成后,变量的地址已经相对固定了。我们用IDA打开elf文件,看到key的地址为[bp+8h],overflowme的地址为[bp-2Ch],两者相差了8h+2Ch=52,所以我们用52个字符填充就可以了,其后用cafebabe进行填充。最后的payload为: (python -c “print ‘a’*52 + ‘\xbe\xba\xfe\xca’”;cat -) | nc pwnable.kr 9000 直接获取了shell,然后读取flag文件: ls -al total 16512 drwxr-x—  3 root bof      4096 Sep 10  […]

pwnable.kr-col

首先是题目描述: Daddy told me about cool MD5 hash collision today. I wanna do something like that too! ssh [email protected] -p2222 (pw:guest) 看下文件: [email protected]:~$ ls -al total 32 drwxr-x—  4 root col  4096 Aug 20  2014 . dr-xr-xr-x 66 root root 4096 Jul  1 02:14 .. d———  2 root root 4096 Jun 12  2014 .bash_history -r-sr-x—  […]