본문 바로가기

Pwnable/Pwnable CTF14

[Pwnable.kr] Toddler's Bottle_leg 문제를 보니 문제의 ssh 다운로드 주소가 보인다. ssh는 원격지 호스트 컴퓨터에 접속하기 위해 사용되는 인터넷 프로토콜이다. 기본 포트로 22번을 사용한다. key1부터 3까지의 함수들은 ARM 어셈블리어로 작성이 되어 있는 것을 알 수 있다. 먼저, mian 함수를 보면 위 3개의 함수 값을 모두 더한 값을 맞추면 플래그를 얻을 수 있을 것 같다. 함수를 통해 구한 r0 값을 모두 더해서 최종적으로 r2에 들어간다. 각 함수를 자세히 살펴보자. key1() 함수의 c와 어셈블리 코드이다. pc 값을 r3에 넣고 다시 그 r3을 r0에 넣었다. pc 값이 key1 값이라는 것을 알 수 있다. 그렇다면 pc란 무엇일까? cpu가 명령어 하나를 수행할 때 fetch > decode > execute의 과.. 2021. 4. 27.
[Pwnable.kr] Toddler's Bottle_input 문제를 확인하였다. 문제에서 엄마? 내 입력을 컴퓨터 프로그램에 어떻게 전달할 수 있습니까? 라고 말하고 있다. 문제에 접속하였다. 먼저 C 코드를 확인해보자. 전체적으로 코드를 보았을 때 Stage 1부터 5까지 모두 통과해야 플래그를 얻을 수 있다. 먼저 Stage1을 통과해야 하는 조건을 보자. 1. 인자의 개수 = 100개 2. argv['A'] = \x00 2. argv['B'] = \x20\x0a\x0d 이 세 가지 조건을 만족하면 Stage 1을 성공할 수 있다. Stage2를 보면 stdin으로 \x00\x0a\x00\xff 입력 값을 주고 sterr로 \x00\x0a\x02\xff을 주어야 성공할 수 있다. Stage 3을 보면 환경변수와 관련 되었다는 것을 알 수 있다. \xde\xad.. 2021. 4. 6.
[Pwnable.kr] Toddler's Bottle_random 처음 화면에 들어가면 보이는 문제이다. 아빠, 프로그래밍에서 임의의 값을 사용하는 방법을 가르쳐주세요! 라고 문제에서 얘기하고 있다. 우분투를 사용하여 문제에 접속하였다. ls -l 을 이용하여 파일 목록을 확인하였다. 먼저, 소스코드를 확인하겠다. unsigned int로 key를 입력받고 rand()와 XOR시킨 값을 0xdeadbeaf와 비교해서 같으면 flag가 실행되면서 플래그 값을 획득할 수 있다. rand()가 랜덤으로 난수를 생성한다. rand() 함수는 그대로 사용하면 랜덤 값이 아닌 같은 값을 출력한다는 취약점을 가지고 있다. 따라서 실행할 때마다 바뀌는 난수를 얻지는 못한다. rand 함수의 번위는 0~RAND_MAX(0x7fff)이다. 즉, 0~3276을 의미한다. 소스코드를 보니 .. 2021. 4. 6.
[Pwnable.kr] Toddler's Bottle_passcode 문제이다. 먼저, 문제에 있는 passcode@pwnable.kr로 접속한다. 여기서 login() 함수를 보면 입력을 받는 부분이 존재한다. 이 둘은 입력값을 passcode1에 저장을 하는 것이 아니라, passcode1을 주소로 한 곳에 저장을 하게 된다. 두 변수 모두 초기화되지 않았기 때문에 더미값이 들어가 있을 것이고, 그 더미 값을 주소로 하는 곳에 입력 값을 저장하게 되는 코드라 오류가 나게 된다. welcome 함수에서 가장 중요한 부분은 welcome+38~+48이다. lea edx, edp-0x70으로 edx에 edp-0x70이라는 주소 값을 넣어주었고, 이 값이 mov 되면서 scanf 함수에 그대로 전달된다. 이를 통해서 우리는 edp-0x70이 name[100]의 시작주소라는 것.. 2021. 3. 31.
[Pwanable.kr] Toddler's Bottle_flag flag 문제에 들어가자마자 보이는 환경이다. flag 파일을 리버싱 해서 flag를 찾아야 하는 문제이다. 포너블 flag 문제를 다운로드 받았다. seedUbuntu 환경에서 gdb를 통해 분석하려고 한다. symbol을 읽을 수 없다. 패킹이 되어있는 거 같다. 헥스 에디터를 통해 확인한다. UPX로 패킹되어있고 ELF 임을 알 수 있었다. 먼저 UPX로 언패킹을 해준다. UPX를 언패킹한다. 패킹을 푼 후, hxd에 가서 풀린 것을 확인한다. 아까 upx가 있던 자리에 아무것도 없는 것을 확인할 수 있다. 패킹이 풀렸다. IDA를 통하여 다시 flag 파일을 열었다. 키 값을 보면 malloc 함수와 flag 변수가 보인다. flag 변수를 찾으면 flag를 확인할 수 있다. 2021. 3. 31.
[Pwnable.kr] Toddler's Bottle_bof 문제에 들어가면 가장 먼저 만나는 창이다. 문제에서 우리에게 버퍼 오버플로우 문제라고 말하고 있다. nc를 통해 문제에 접근할 수 있다고 한다. 이제까지 풀었던 문제는 모두 ssh를 통하여 들어갔다. nc(Netcat): TCP/UDP 프로토콜로 연결된 네트워크 상에서 데이터를 읽고 쓸 수 있는 간단한 리눅스 유틸리티라고 한다. 네트워크에 연결된 서버 간의 포트 오픈을 확인할 수 있고, listen 모드로 자신이 서버가 되는 기능을 제공하기도 한다. nc 명령어로 접속했더니 다음과 같이 뜨는 것을 확인하였다. 오버플로우에 실패한 것 같다. bof.c 파일을 다운로드 받고 확인하였다. Buffer over flow : 프로그래머가 지정한 버퍼의 범위를 넘어서 입력 시 다른 데이터를 덮어쓸 수 있는 취약점이.. 2021. 3. 23.