728x90

서버에 접속했을때


readme를 먼저 읽어본다.


readme를 보면 asm파일이 asm_pwn권한으로 9026포트에서 돌아가고있다고한다. nc 0 9026에 연결해서 플래그를 얻을 수 있다.

플래그는 플래그파일의 이름은 여기 디렉토리에 있는 이름과 같다.


문제소스를 보자.


메인을 보면 출력해주는 문장들이 있다. shellcode를 만들 때 open(), read(), write() syscall 만을 사용해서 만들라고한다.


sandbox 함수를 실행시키는 밑부분을 보면 sh를 실행시키는 것을 알 수 있다. 

sh는 처음에 0x90 * 0x1000 으로 초기화 시키고 stub 를 포함시키며, read함수를 통해 sh에 원하는 데이터를 1000byte만큼 입력할 수 있다. 

sh에 포함되는 stub[] 가 뭔지 알아내자.


해당 기계어코드를 디스어셈블 한다.

모든 레지스터들을 0으로 초기화 시키는 것이다. syscall하기가 편해졌다.




chroot는 '프로세스 고립' 이라고 보면 된다. 주석을 보면 symlink 를 사용하지 못하게 하기위해 사용했다고 적혀있다.



Seccomp란 secure computing mode의 약자이다. Scmp_act_allow를 통해 syscall 가능한 함수들의 화이트 리스트를 뽑아주는 함수이다.

소스를 보면 open, read, write, exit, exit_group가 syscall 가능하다.


위 문제를 푸는 방법은 open을 통해 플래그 파일의 fd를 받아오고, read를 통해 flag파일의 데이터를 rsp에 저장, write함수를 호출하여

rsp에 저장된 데이터를 출력하게 만들어야한다.


쉘코드를 만드는 소스이다.

아키텍쳐를 arch 에 넣어주고 os도 설정해준다.

아키텍쳐나 os의 정보는 uname -a 명령을 통해서 확인 가능하다.

shellcraft함수를 통해 open,read,write 함수의 인자들을 설정해주어 기계를 출력할 수 있다.


open에 fd를 받아와야하는 파일의 이름을 넣어주고, read함수에 해당 fd가 저장되어있는 rax와 저장할 주소인 rsp, 그리고 사이즈를 넣어준다.

이후 write를 통해서 fd를 1로 설정하고 flag데이터가 저장되어있는 rsp와 size 100을 인자로 넣어주어 flag가 출력되게 해준다.


해당 쉘코드를 기계어 형태로 출력하면 문자들이 깨지기때문에 hexencode를 통해 출력해주고

페이로드 삽입시 hexdecode를 해준다.

flag가 출력된다. 이후 readme에 나와있는 포트주소에 데이터를 보내어 실제 flag를 받아온다.





쉘크래프트 좋다.

728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

fsb  (0) 2018.12.21
brainfuck  (0) 2018.12.21
passcode  (0) 2018.12.21
horcruxes  (0) 2018.12.21
cmd1  (0) 2018.12.21
728x90

main함수를 보면 welcome함수를 호출한다. welcome함수에서는 100byte만큼 name값을 할당해 줄 수 있다.

login함수에서는 passcode1과 passcode2를 해당 값들과 비교하여 플래그를 출력시켜 준다.

scanf함수를 잘보면 해당 변수의 주소를 가리켜 주는 &가 빠져있다. 

그로므로 해당 scanf함수는 인자로들어간 변수들의 주소값을 입력시킬 수 있는것이다.


welcome 함수를 잘보면 name변수의 시작주소가 ebp-0x70인것을 알 수 있다.

ebp-0x70부터 100을 더하면 ebp-0xc가 된다. name변수를 통해 입력해줄 수 있는 구간은 ebp-70x ~ ebp-0xc이다.


login함수에서 passcode 입력하는 부분이다.

passcode의 시작이 ebp-0x10이다. 이것을 통해 name변수와 입력하는 passcode의 주소가 ebp-0x10 ~ ebp-0xc로 4byte 겹친다는 것을 알 수 있다.


또한 scanf함수에서 &passcode1이 아니라 passcode1 를 사용한다.


정리를 해보면 name에서 name[96], name[97], name[98], name[99] 즉 마지막 4바이트는 passcode1이 가리킬 주소로 설정이 가능하며, 이후 scanf를 통해 해당 주소값을 변경 시켜줄 수 있다.    ==> got overwrite가 가능하다.


name에 96bytes 는 아무값이나 넣어주고 마지막 4바이트는 scanf다음에 호출하는 함수인 fflush 함수의 got를 넣어준다. passcode1의 주소가 fflush함수의 got를 가리키고 있는 상황에서 scanf함수를 통해 플래그를 출력해주는 if문 안의 주소로 변경해준다.


그러면 fflush함수를 실행시킬때 plt를 통해 정상적으로 got를 호출하지만 변경된 got를 통해 if문안의 주소를 호출하게 될것이다.


페이로드 작성을 위해 필요한것

fflush got

fflush의 got는 0x804a0080이다.


이동시킬 주소

이동시킬 주소는 0x080485e3이다. system함수의 인자가 들어가야하기 때문이다.


scanf에서 passcode1의 값을 %d 즉 10진수 정수형으로 받기 때문에 0x080485e3을 10진수인 134514147로 입력시켜준다.



입력받는 데이터의 길이를 잘 파악 해야한다.

원하는 주소값을 변경할 수 있으면 got overwrite가 가능해진다.

728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

brainfuck  (0) 2018.12.21
asm  (0) 2018.12.21
horcruxes  (0) 2018.12.21
cmd1  (0) 2018.12.21
leg  (0) 2018.12.19
728x90


Hint함수

int_ABCDEFG 함수


랜덤한 값의 a,b,c,d,e,f,g이다. 그리고 모두 합한 값을 sum에 넣는다.



Ropme 함수

입력한 알파벳에 해당하는 함수를 호출하고  a~g까지의 알파벳이아닌 값을 입력한후 sum과 같은값을 입력하면 flag를 출력해준다.

a를 입력했을 때 A함수를 실행시키는데 이때 랜덤한 a의 값을 출력시켜준다.



해당 문제에서 취약점은 gets함수에서 발생한다.

gets함수를 통해 overflow가 가능하다. 이것을 활용하여 if문안으로 접근해서 바로 플래그를 얻으려고 했으나

ropme함수의 주소가 0x080axxxx 이다. gets함수에서 0a값이 들어가면 개행문자로 인식하여 gets함수가 끝난다.

이 때문에 바로 ropme함수로 접근할 수 없다. 

그렇기 때문에 rop를 통하여 A~G까지의 함수호출을 통해 값을 추출해 내고 sum을 구하여 입력하는 방법으로 접근해야한다.


gets함수의 인자인 input2이다. ebp-0x74 위치에서 시작하므로 ebp까지덮으면 0x78이다. 0x78까지 덮고 ret주소를 A함수부터 G함수까지 차례대로 넣어주고 출력된값을 모두 더하여 입력시켜주면 flag를 얻을 수 있다.


페이로드이다.

recvuntil을 통해서 출력되는 문자열을 필요한부분만 잘라내어 정수값만 추출해 낸다. 이후 정수값들을 모두 더한뒤 8byte만큼 잘라주고 

비트 and 연산을 통해 부호를 살려주어 sum의 값으로 보낸다.

이것을 실행하면 플래그가 나온다.



문자열에서 원하는 값만 추출할 수 있다. recvuntil 활용


728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

asm  (0) 2018.12.21
passcode  (0) 2018.12.21
cmd1  (0) 2018.12.21
leg  (0) 2018.12.19
lotto  (0) 2018.12.19
728x90


flag 와 sh, tmp라는 단어가 필터링 되어있다.

우리가 넣은 인자를 필터링하고 이후 system 함수로 실행시킨다.



1. 와일드 카드



2. 환경 변수




728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

passcode  (0) 2018.12.21
horcruxes  (0) 2018.12.21
leg  (0) 2018.12.19
lotto  (0) 2018.12.19
random  (0) 2018.12.19
728x90

pc 레지스터에대한 이해가 필요하다.


cpu가 하나의 명령어를 수행할 떄 fetch -> decode -> execute의 과정을 거친다.

2개의 opcode를 실행하려면 fetch -> decode -> execute -> fetch -> decode -> execute 총 6번의 작업이 필요하다.

그러나 pipe line 을 통해서


1            2            3            4

   fetch        decode    execute    

fetch        decode    execute


위처럼 병렬적으로 단계를 수행하게 된다. 2개의 opcode를 실행할 때 4번의 작업으로 실행시키는 것이다.


pc 레지스터는 fetch할 주소를 담고 있다.

현재 명령어가 execute 즉 실행단계라면, 다음 명령어는 decode 단계이고, 그 다음 명령어는 fetch 단계이다.

그렇기 때문에 pc레지스터에는 실행시킬때 다다음번째 명령어의 주소를 담고 있다.



leg 문제풀이

key1


적용시켜보면 0x00008cdc에서의 pc레지스터에는 그 다음다음 번째 주소인 0x00008ce4가 들어가 있다.



key2

pc는 0x00008d04의 다음다음 주소인 0x00008d08이고, 다음 명령어를 보면 adds r3, #4가 있다.

그렇기때문에 key2는 0x8d0c 이다.


key3


lr 레지스터는 ret에 있는 주소값을 가져온다. 즉 key3 함수가 끝난후 실행될 opcode의 주소를 받아온다.

0x8d80이다.


key1 + key2 + key3 를 하면 총 합은 108400이다.



플래그획득



============================================================================================

새로보는 레지스터들이 많았다. 배경지식필요 공부 필요

어셈코드를 잘읽을 줄 알아야한다. -> 어셈코딩공부를 하자.


728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

horcruxes  (0) 2018.12.21
cmd1  (0) 2018.12.21
lotto  (0) 2018.12.19
random  (0) 2018.12.19
blackjack  (0) 2018.12.19
728x90


문제의 main함수 소스이다.

play함수를 분석해야한다.




소스코드를 보면 랜덤한 6바이트값을 lotto에 받아오고 해당값을 1~45로 맞춰준다.

이후 lotto 값과 우리가 직접 입력해주는 submit 값을 비교한다.




아스키코드표를 보면 1~45중에 직접 입력가능한 데이터는 !"@#$%^&*()- 이다.


문자열 비교하는 부분을 다시 분석해보면

위 부분이 취약하다.

반복문을 잘보면 lotto[i] 를 submit[0~5]까지 모두 검증한다.  위를 통해 lotto 6byte 문자열중 1개만 일치하면 match의 값이 6이 되면서  flag를 얻을 수 있다.



!"@#$%^&*()- 중에 *를 6개를 입력해준다.

lotto에 할당된 랜덤값중 하나가 *과 일치하나보다. flag가 출력된다.


==========================================================================================

로직을 잘 분석해야한다.




자료형을 잘봐야한다. submit 이 char로 선언되어있어 우리가 입력 할 수 있는 문자가 한정적이였다.

728x90

'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글

cmd1  (0) 2018.12.21
leg  (0) 2018.12.19
random  (0) 2018.12.19
blackjack  (0) 2018.12.19
shellshock  (0) 2018.12.19

+ Recent posts