본문 바로가기

Pwnable.kr

Pwnable.kr[fix]

#include <stdio.h>

// 23byte shellcode from http://shell-storm.org/shellcode/files/shellcode-827.php
char sc[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
		"\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";

void shellcode(){
	// a buffer we are about to exploit!
	char buf[20];

	// prepare shellcode on executable stack!
	strcpy(buf, sc);

	// overwrite return address!
	*(int*)(buf+32) = buf;

	printf("get shell\n");
}

int main(){
        printf("What the hell is wrong with my shellcode??????\n");
        printf("I just copied and pasted it from shell-storm.org :(\n");
        printf("Can you fix it for me?\n");

	unsigned int index=0;
	printf("Tell me the byte index to be fixed : ");
	scanf("%d", &index);
	fflush(stdin);

	if(index > 22)	return 0;

	int fix=0;
	printf("Tell me the value to be patched : ");
	scanf("%d", &fix);

	// patching my shellcode
	sc[index] = fix;	

	// this should work..
	shellcode();
	return 0;
}

위는 코드

 

아래는 해당 쉘코드 어셈으로 나타낸 거

asm value index
xor eax, eax \x31\xc0 0~1
push eax \x50 2
push "//sh"   3~7
push "/bin"   8~12
mov ebx, esp \x89\xe3 13~14
push eax \x50 15
push ebx \x53 16
mov ecx, esp \x89\xc1 17~18
mov al, 0xb \xb0\x0b 19~20
int \x80 \xcd\x80 21~22

 

우선 interrupt 0x80을 할 때 reference 참고하면

eax에 0xb (execve의 syscall 넘버)

ebx에 실행할 프로세스(여기서는 "/bin/sh") 이름의 시작 위치

ecx에는 "/bin/sh"의 이름 주소의 포인터가 필요하다

 

gdb에서 실행을 해보면 index 15의 push eax를 할 때 가장 뒤쪽의 명령어가 덮어쓰여진다.

 

스택 영역을 eip가 지나가고 있는데, 여유공간이 없어서 eip가 실행해야할 다음 명령어마저 덮어버리는 것이다. 

 

바꿀 수 있는 건 1바이트 뿐이고 index 15를 계속 공략했지만 모르겠음

-----------------------

 

push eax를 하는 이유가 0을 푸쉬해주기 위함이므로 esp를 0으로 차있는 곳으로 뛰고 다음 코드를 진행하면

정상 작동이 된다.

 

이를 위해서 ulimit을 이용해서 stack영역을 unlimited하고 pop esp를 하는 방식을 사용한다.

pop esp한 뒤 esp값은 /bin을 의미하는 0x6e69622f인데 해당 주소도 스택으로 치지만

값은 들어가있지 않아 정상 작동하게 된다. 

 

지적 환영, 배우는 중

'Pwnable.kr' 카테고리의 다른 글

Pwnable.kr [echo2]  (0) 2019.10.10
Pwnable.kr[loveletter]  (0) 2019.09.22
Pwnable.kr[tiny_easy]  (0) 2019.09.15
Pwnable.kr[echo1]  (0) 2019.09.14
Pwnable.kr[ascii_easy]  (0) 2019.09.14