article thumbnail image
Published 2022. 5. 6. 16:35

 

leg - 2 pt [writeup]

 

๋ฌธ์ œ

 

 

ssh leg@pwnable.kr -p2222 (pw:guest)๋ฅผ ํ†ตํ•ด ์ ‘์†์— ์„ฑ๊ณตํ–ˆ๋‹ค.

 

 

 

ls -al

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ํ•œ ๊ฒฐ๊ณผ๊ฐ’์ด๋‹ค.

disassemble main

mainํ•จ์ˆ˜๋ฅผ ๋””์Šค์–ด์…ˆ๋ธ”ํ•œ ๊ฒฐ๊ณผ์—์„œ, main +48 / main +56, main +60 / main +68, main +72๋ถ€๋ถ„์„ ๋ณด๋ฉด ๊ฐ๊ฐ key1, key2, key3ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ณตํ†ต์ ์œผ๋กœ r0์— ์ €์žฅ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋ฅผ ๋””์Šค์–ด์…ˆ๋ธ”ํ•œ ๊ฐ’์—์„œ r0์˜ ๊ฐ’์„ ํ™•์ธํ•ด๋ณด์ž.

 

 

 

disassemble key1

key1 +8์„ ๋ณด๋ฉด pc์˜ ๊ฐ’์ด r3์— ์ €์žฅ๋˜๊ณ , key1 +12์—์„œ r3์˜ ๊ฐ’์ด r0์— ์ €์žฅ๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— r0์—๋Š” pc์˜ ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค.

 

์ด๋•Œ pc๋Š” Program Counter๋กœ, ๋‹ค์Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ key1 +8์— ์กด์žฌํ•˜๋Š” pc์—๋Š” 0x00008ce0์ด ์ €์žฅ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

 

 

disassemble key2

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
๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค!