
leg - 2 pt [writeup]
ssh leg@pwnable.kr -p2222 (pw:guest)๋ฅผ ํตํด ์ ์์ ์ฑ๊ณตํ๋ค.
ls -al ๋ช ๋ น์ด๋ฅผ ํตํด์ ์กด์ฌํ๋ ๋ชจ๋ ํ์ผ๋ค๊ณผ ๋๋ ํ ๋ฆฌ๋ค์ ์ถ๋ ฅํด์ฃผ์๋ค.
์ฐ์ ๋ฌธ์ ์์ ์ฃผ์ด์ง leg.c๋ฅผ ํ์ธํด์ฃผ์๋ค.
#include <stdio.h>
#include <fcntl.h>
int key1(){
asm("mov r3, pc\n");
}
int key2(){
asm(
"push {r6}\n"
"add r6, pc, $1\n"
"bx r6\n"
".code 16\n"
"mov r3, pc\n"
"add r3, $0x4\n"
"push {r3}\n"
"pop {pc}\n"
".code 32\n"
"pop {r6}\n"
);
}
int key3(){
asm("mov r3, lr\n");
}
int main(){
int key=0;
printf("Daddy has very strong arm! : ");
scanf("%d", &key);
if( (key1()+key2()+key3()) == key ){
printf("Congratz!\n");
int fd = open("flag", O_RDONLY);
char buf[100];
int r = read(fd, buf, 100);
write(0, buf, r);
}
else{
printf("I have strong leg :P\n");
}
return 0;
}
key๋ฅผ ์ ๋ ฅ๋ฐ์์ key1(), key2()์ key3()์ ๊ฐ์ ํฉํ์ ๋ key๊ฐ ๋๋ค๋ฉด flag๋ฅผ ์ป์ ์ ์์ ๊ฒ ๊ฐ๋ค.
๋ฌธ์ ์์ ์ฃผ์ด์ง leg.asm๋ ํ์ธํด๋ณด์๋ค.
๊ฐ๊ฐ main ํจ์, key1ํจ์, key2ํจ์ ๊ทธ๋ฆฌ๊ณ key3ํจ์๋ฅผ disassembleํ ๊ฒฐ๊ณผ๊ฐ์ด๋ค.
mainํจ์๋ฅผ ๋์ค์ด์ ๋ธํ ๊ฒฐ๊ณผ์์, main +48 / main +56, main +60 / main +68, main +72๋ถ๋ถ์ ๋ณด๋ฉด ๊ฐ๊ฐ key1, key2, key3ํจ์๋ฅผ ํธ์ถํ๊ณ ๊ณตํต์ ์ผ๋ก r0์ ์ ์ฅ๋๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
๊ฐ๊ฐ์ ํจ์๋ฅผ ๋์ค์ด์ ๋ธํ ๊ฐ์์ r0์ ๊ฐ์ ํ์ธํด๋ณด์.
key1 +8์ ๋ณด๋ฉด pc์ ๊ฐ์ด r3์ ์ ์ฅ๋๊ณ , key1 +12์์ r3์ ๊ฐ์ด r0์ ์ ์ฅ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ r0์๋ pc์ ๊ฐ์ด ์ ์ฅ๋๋ค.
์ด๋ pc๋ Program Counter๋ก, ๋ค์ ์คํํ ๋ช ๋ น์ด์ ์ฃผ์๋ฅผ ๋ด๊ณ ์๋ค.
๋ฐ๋ผ์ key1 +8์ ์กด์ฌํ๋ pc์๋ 0x00008ce0์ด ์ ์ฅ๋์ด ์์ ๊ฒ์ด๋ค.
key2 +20์์ pc์ ์ฃผ์๊ฐ์ด r3์ผ๋ก ์ฎ๊ฒจ์ง๊ณ , key2 + 22์์ r3์ 4๋ฅผ ๋ํ์ผ๋ฉฐ,
key2 + 32์์ r3์ ๊ฐ์ด r0๋ก ์ฎ๊ฒจ์ก๊ธฐ ๋๋ฌธ์ r0์๋ key2 + 20์์์ pc๊ฐ์ธ
0x00008d06 + 4 = 0x00008d0A์ด ์ ์ฅ๋์ด ์๋ค๋ ๊ฑธ ์ ์ ์๋ค.
key3 + 8์์ lr์ ๊ฐ์ด r3์ผ๋ก ์ฎ๊ฒจ์ง๊ณ , key +12์์ r3์ ๊ฐ์ด r0์ผ๋ก ์ด๋ํ๊ธฐ ๋๋ฌธ์ r0์๋ lr์ ๊ฐ์ด ์ ์ฅ๋๋ค.
lr์ Link Register๋ก, ํจ์๋ฅผ ํธ์ถํ ๋ค ๋ฆฌํดํ๋ ์ฃผ์๋ฅผ ์ ์ฅํ๋ค.
์์ disassemble main์์ key3ํจ์๋ฅผ ํธ์ถํ๊ณ ๋ฆฌํดํ๋ ์ฃผ์๊ฐ ์ ์ฅ๋๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ main +68์ ์ฃผ์ 0x00008d80์ด ์ ์ฅ๋๋ค.
๊ฐ๊ฐ์ ํจ์์์ r0์ ์ ์ฅ๋ ๊ฐ์ ํฉ์ณ๋ณด๋ฉด,
8ce0 + 8d0A + 8d80 = 1a76a
1a76a์ 10์ง์๋ก ๋ณํํ๋ฉด,108394์ด๋ค.
ํ๋ ธ๋ค,, ๊ตฌ๊ธ๋ง์ ๋ ํด๋ณด๋ pc๊ฐ์ด ์๋ชป๋ ๊ฑธ ์๊ฒ ๋๋ค.
ARM์์๋ ๋ช ๋ น์ ์คํํ๋ ๊ฒ 4๋จ๊ณ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
fetch → decode → execute → write
๊ทธ๋ฆฌ๊ณ pc๋ fetchํ ์ฃผ์๋ฅผ ๋ด๊ณ ์๋ค.
์ฒซ๋ฒ์งธ ๋ช ๋ น์ด๊ฐ execute ๋จ๊ณ๋ผ๋ฉด ๊ทธ ๋ค์ ๋ช ๋ น์ด๋ decode ๋จ๊ณ์ด๊ณ , ๋ ๊ทธ ๋ค์ ๋ช ๋ น์ด๋ fetch๋จ๊ณ์ธ ๊ฒ์ด๋ค.
pipe line์ ์ํด 0x00008ce4๊ฐ fetch๋ ๋ถ๋ถ์ด๋ค.
์ฝ๊ฒ ์๊ฐํ์๋ฉด pc๋ ํ์ฌ ์คํ๋๊ณ ์๋ ๋ช ๋ น์ ๋ค๋ค์ ๋ช ๋ น์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก pc์ ๊ฐ์ 0x00008ce4์ด๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก key2์ r0์ ๊ฐ์ ๋ค์ ๊ตฌํด๋ณด์.
key2 +24์ ์ฃผ์์ ํด๋นํ๋ 0x00008d08์ด pc๊ฐ์ด ๋๊ณ , ๋ฐ๋ผ์ key2์์ r0์ ๊ฐ์
0x00008d08 + 4 = 0x00008d0c์ด๋ค.
key1, key2, key3์ r0๊ฐ์ ๋ค ๋ํ key๊ฐ์ ๊ตฌํด๋ณด์.
0x00008ce4 + 0x00008d0c + 0x00008d80 = 1a770
1a770์ 10์ง์๋ก ๋ณํํ๋ฉด 108400์ด๋ค.
'Pwnable' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[pwnable] bof (0) | 2022.05.18 |
---|---|
[pwnable] shellshock (0) | 2022.05.18 |
[pwnable] fd (0) | 2022.05.04 |
[pwnable] File Descriptor (0) | 2022.05.04 |