Try to be the expert.

Ainsetin's Hacking & PS & Math

rtl 3

HackCTF Unexploitable #1 Write-up

이번엔 기본 RTL 문제를 풀어보겠다. 우선 보호 기법부터 확인하자. 보니까 평범하게 컴파일된 바이너리이다. NX bit만 설정되어 있는 것을 볼 수 있다. IDA로 코드를 보자. 우선 64byte 입력에 s의 크기가 16byte이므로 BOF가 가능하다. 보니까 easy RTL 이라고 되어 있다. 왜 그런지 확인해보자. 여기서 system을 호출하므로 call 할 때의 주소를 RET에 집어넣으면 되겠다. 문제는 "/bin/sh"문자열을 구해야 한다는 것인데, 어디선가 "sh"라고만 쳐도 쉘이 실행되는 것을 본 적이 있었다. 일단 Shift+F12로 문자열 검색을 해보았다. 보니까 fflush 문자열이 있는 것을 확인할 수 있었다. 따라서 그냥 's'의 주소를 찾아 "sh" 문자열을 읽어낼 수 있다. 알파..

Hacking/HackCTF 2020.02.20

HackCTF pwning Write-up

이번에는 pwning 문제를 풀어보겠다. 췤쉨췤쉨췤쉑 음 평범한 NX Partial RELRO 문제이다. IDA로 코드 분석해보자. 우선 main에서는 vuln 함수를 호출한다. vuln 함수는 입력하고 싶은 문자열의 길이를 입력한 후 조건을 만족하면 nptr에 입력할 수 있는 함수 같다. 그런데, 입력할 때 일반적인 gets를 사용하지 않고 get_n이라는 함수를 거쳐 받는다. 어떤 취약점이 있을지 한번 get_n을 보자. 보니 a1이라는 주소부터 v5를 증가시키면서 하나하나씩 대입하는 것을 볼 수 있다. 그런데.... 함수의 두 번째 인자는 unsigned int, 즉 부호 없는 int형이었다!! 따라서 우리는 첫 번째 입력을 할 때 -1을 입력한다면, vuln 함수에서 v2=-1이 되어 if문을 통..

Hacking/HackCTF 2020.01.14

HackCTF gift Write-up

이번엔 gift 문제를 풀어보겠다. 우선 바이너리부터 checksec 해보겠다. 이번엔 RELRO도 없다. NX bit는 기본으로 활성화되어 있다. 그럼 IDA로 바이너리를 까 보자. 보니까 binsh의 주소와 system의 주소를 전부 다 주고 fgets로 s에 입력을 받은 뒤, 다시 한번 출력 후 입력을 받는다. 그런데 binsh에는 아무 값도 없는 것을 보아 내가 직접 저 부분에 "/bin/sh"을 집어넣어야 한다는 것을 알게 되었다. 굳이 안 넣고 그냥 libc에 있는 binsh 문자열 주소를 가져올 것이다. fgets에서는 128byte를 입력받을 수 있지만, gets에서는 길이 제한이 없다. 따라서 gets에서 BOF를 터뜨릴 것이다. 앞의 fgets에서는 아무거나 넣고, 앞에서 system의..

Hacking/HackCTF 2020.01.08