Bace

picoCTF 2018 - buffer overflow 1 본문

picoCTF 2018/Binary Exploitation

picoCTF 2018 - buffer overflow 1

Bace 2020. 5. 22. 02:07

 

소스를 봐보았다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include "asm.h"

#define BUFSIZE 32
#define FLAGSIZE 64

void win() {
  char buf[FLAGSIZE];
  FILE *f = fopen("flag.txt","r");
  if (f == NULL) {
    printf("Flag File is Missing. Problem is Misconfigured, please contact an Admin if you are running this on the shell server.\n");
    exit(0);
  }

  fgets(buf,FLAGSIZE,f);
  printf(buf);
}

void vuln(){
  char buf[BUFSIZE];
  gets(buf);

  printf("Okay, time to return... Fingers Crossed... Jumping to 0x%x\n", get_return_address());
}

int main(int argc, char **argv){

  setvbuf(stdout, NULL, _IONBF, 0);
  
  gid_t gid = getegid();
  setresgid(gid, gid, gid);

  puts("Please enter your string: ");
  vuln();
  return 0;
}

 

main 함수에서 please enter your string: 이 나오고 vuln 함수로 건너간다.

vuln 함수에서 데이터를 입력 받아 return할 주소를 입력받는다.

 

이 때 ret 주소를 win 함수 주소로 바꿔치기 하면 될 것 같다.

주어진 쉘서버 경로로 들어가보았다.

파일은 32비트 파일이다.

 

gdb로 vuln 파일에 들어가서 함수들을 봐보았다.

일단 ret 주소로 바꿔야할 win의 주소를 알아냈다. 0x080485cb

 

그리고 vuln 함수를 봐보았다.

 

버퍼가 0x28만큼 주어지기 때문에 ret주소는 0x28 + sfp(4바이트) + ret 이므로 44 바이트 이후에 win의 주소를 보내주면 된다.

python을 이용하여 a를 44개 찍어냈다.

 

a * 44개 이후에 abcd를 넣으면 결과값이 abcd로 나올 것이다.

 

생각한대로 abcd가 리틀엔디안으로 들어갔다.

이제 win함수 주소를 리틀엔디안으로 바꿔서 abcd 자리에 넣으면 된다.

위와 같이 보내면 flag를 준다.

 

picoCTF{addr3ss3s_ar3_3asy56a7b196}

'picoCTF 2018 > Binary Exploitation' 카테고리의 다른 글

picoCTF 2018 - buffer overflow 2  (0) 2020.05.22
picoCTF 2018 - shellcode  (0) 2020.05.22
picoCTF 2018 - leak me  (0) 2020.05.22
picoCTF 2018 - buffer overflow 0  (0) 2020.05.21