문제를 풀어보자!!

 

 

[코드 분석]

main

int main(int argc, char* argv[]){
	if(argc<2){
		printf("usage : %s [passcode]\n", argv[0]);
		return 0;
	}
	if(strlen(argv[1]) != 20){
		printf("passcode length should be 20 bytes\n");
		return 0;
	}

	if(hashcode == check_password( argv[1] )){
		system("/bin/cat flag");
		return 0;
	}
	else
		printf("wrong passcode.\n");
	return 0;
}

1. argv[1]에 입력된 값이 20byte를 넘어서는 안된다.

2. check_password에서 입력한 password를 검사하고, 검사한 password가 hashcode와 같다면 flag를 읽을 수 있다.

 

check_password

unsigned long check_password(const char* p){
	int* ip = (int*)p;
	int i;
	int res=0;
	for(i=0; i<5; i++){
		res += ip[i];
	}
	return res;
}

1. p[0] ~ p[4]까지의 입력 값을 더한 후 return 한다.

 

즉, hashcode를 5로 나눠서 인자로 보내면, flag를 얻을 수 있다.

 

[EXPLIT]

1.hashcode값을 5로 나눠서 입력 값을 구하자.

hashcode = 0x21DD09EC

5로 나눴더니 나머지가 4가 나왔다.

payload = "\xc8\xce\xc5\x06" * 4 + "\xcc\xce\xc5\x06"

 

2.exploit

'포너블 > pwnable.kr' 카테고리의 다른 글

[Pwnable.kr] 1. fd  (0) 2024.04.21
[pwnable.kr] shellshock  (0) 2020.03.09
[pwnable.kr] mistake  (0) 2020.03.09
[pwnable.kr] leg  (0) 2020.03.09
[pwnable.kr] input2  (0) 2020.02.27

문제를 한 번 풀어보자.

 

[코드 분석]

fd의 인자로 0x1234를 줘서 fd값을 0으로 만들어 준다.

buf에 LETMEWIN을 입력해 주면, flag를 얻을 수 있다.

 

[EXPLOIT]

0x1234 => 4660

'포너블 > pwnable.kr' 카테고리의 다른 글

[Pwnable.kr] 2. collision  (1) 2024.04.21
[pwnable.kr] shellshock  (0) 2020.03.09
[pwnable.kr] mistake  (0) 2020.03.09
[pwnable.kr] leg  (0) 2020.03.09
[pwnable.kr] input2  (0) 2020.02.27

Checksec

Code

Code분석

"DEADBEEF" -> 0x0000000B000000B5로 바꿔주면 된다.

 

Payload

->s의 시작 위치를 찾자.

rbp-0xa0s[0]을 가리킨다.

 

->"DEADBEEF"의 위치를 찾아보자.

입력 값 : 1000000 2000000 0 (index = 7)

7fffffffdbc0 : s[0]을 가리킨다.

7fffffffdbd0: "DEADBEEF"

  • s[2]=0xDEADBE
  • s[1]=0XEF

7fffffffdbf8: 1000000+2000000의 결과

 

, s[2] = 0x0B000000을 넣고,

s[1] = 0x000000000000B5을 넣어 주면 flag를 얻을 수 있을 것이다.

Exploit

Flag

'포너블 > pwnable.xyz' 카테고리의 다른 글

[pwnable.xyz] add  (0) 2022.09.06
[pwnable.xyz] sub  (0) 2022.09.06
[pwnable.xyz] welcome  (0) 2022.09.06

보호 기법

Code

Code 분석

->v7 배열의 index를 이용해서 retwin의 주소로 덮어주면 될 것 같다.

->! 그리고 두 번째 입력에서 아무 값이나 줘서 loop문을 빠져나가야 한다.

 

Payload

v7에서 ret까지의 index구하기

1. v4v5를 더하는 곳에 bp를 건다.

2.input을 한다.

->0index1245678이라는 값을 넣었다.

3.ret까지의 idx를 구한다.

0x7fffffffdc30 : v7[0] = 12345678 이 된다. (0x7fffffffdc30)

0x7fffffffdc90: ret (0x7fffffffdc98)

index : 13

payload=str(win) + ' 0 13'

 

Exploit

 

Flag

'포너블 > pwnable.xyz' 카테고리의 다른 글

[pwnable.xyz] misalignment  (0) 2022.09.06
[pwnable.xyz] sub  (0) 2022.09.06
[pwnable.xyz] welcome  (0) 2022.09.06

Checksec

Code

코드 분석

  • v4, v5에 수를 입력 받는다.
  • v4v54918보다 크거나 같으면 false가 된다.
  • v4v5의 차이 값이 4919가 되면 flag를 얻을 수 있다.

Payload

-4917 - (-9836) = 4919

 

Exploit

Flag

 

'포너블 > pwnable.xyz' 카테고리의 다른 글

[pwnable.xyz] misalignment  (0) 2022.09.06
[pwnable.xyz] add  (0) 2022.09.06
[pwnable.xyz] welcome  (0) 2022.09.06

보호 기법

코드

코드 분석

  • system함수가 실행되는 조건부터 보자.
    • v3 == 0이 되어야 system함수가 실행된다.
    • v3는 처음에 0x40000만큼 공간이 할당되고, 1이 들어간다.
  • v4에 할당할 size와 데이터를 입력받는다.
    • v4[size-1]=0

Exploit

 

'포너블 > pwnable.xyz' 카테고리의 다른 글

[pwnable.xyz] misalignment  (0) 2022.09.06
[pwnable.xyz] add  (0) 2022.09.06
[pwnable.xyz] sub  (0) 2022.09.06

Canary

스택의 반환 주소(Return Address)를 조작하는 공격 기법으로 부터 보호하기 위해 만들어졌다.

  • 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입 
  • 함수의 에필로그에서 해당 값의 변조를 확인 
  • -fno-stack-protector옵션으로 카나리를 해제할  있다.(활성화 : default라 따로 안해도 됨) 

작동 원리

적용된 바이너리와 적용되지 않은 바이너리를 비교해보자. 

함수 프롤로그 

  • mov rax, QWORD PRT fs:0x28 

-canary 값을 생성해서 rax에 넣는다. 

  • Mov QWORD PTR [rbp-0x8], rax 

  • xor eax, eax 
  • lea rax, [rbp-0x10] 

함수 에필로그 

  • Mov rcx, QWORD PRT [rbp-0x8] 
    • rcx=canary 
  • Xor rcx, QWORD PTR fs:0x28 
    • 프롤로그에서 만든 canary의 값이 변조 되었는지 확인 
  • Je 0x11b3 <main+74> 
    • 변조가  되어있다!! 그럼 정상 종료!!  
  • Call 0x1060 <__stack_chk_fail@plt> 
    • 변조 되었다. 강제 종료!! 

 

Canary 생성 과정 

-Canary 값은 프로세스가 시작될 때, TLS에 전역 변수로 저장하고,  함수마다 프롤로그와 에필로그에서  값을 참조한다. 

  • TLS의 주소 파악 
    • Fs는 TLS를 가리키므로 fs의 값을 알면 TLS의 주소를 알 수 있다. 

    그러나 리눅스에서 fs의 값은 특정 시스템 콜을 사용해야만 조회하거나 설정할  있다. 

    gdb에서 다른 레지스터의 값을 출력하듯 info register fs나, print $fs와 같은 방식으로는 값을 알 수 없다. 

  • arch_prctl(int code, unsigned long addr) 시스템 콜에 중단점을 설정하여 fs가 어떤 값으로 설정되는지 조사해보자. 
    • arch_prctl(int code, unsigned long addr) -> fs값을 설정할  호출됨 

catch 명령 : 특정 이벤트가 발생했을 때, 프로세스를 중지시키는 명령이다. 

ㄴ>rsi의 값 : 0x7fffffffdc90 

ㄴ>rdi의 값 : 0x3001 -> ARCH_SET_FS의 상숫값 

ㄴ>rsi에 있던 주소 + 0x28에 canary값이 들어있어야 한다.

ㄴ>watch : 특정 주소에 값이 바뀌면 실행을 중단 시킨다. 

ㄴ> ?? Canary값이 안들어있네.... 

'포너블 > 공부' 카테고리의 다른 글

FPO(Frame pointer Overflow)  (0) 2020.02.01

 

패스워드 : 56a9bf19c63d650ce78e6ec0354ee45e

입력하면 대문자로 받는 쉘이다.

 

bandit33 : c9c3199ddf4121b10cf581a98d51caee

 

'포너블 > Bandit' 카테고리의 다른 글

bandit level31 -> level32  (0) 2021.08.20
bandit level30 -> level31  (0) 2021.08.20
bandit level29 -> level30  (0) 2021.08.20
bandit level28 -> level29  (0) 2021.08.20
bandit level27 -> level28  (0) 2021.08.20

+ Recent posts