본문 바로가기

WHOIS/Pwnable

Whois 8주차 문제 풀이 과제

1. assembly

이번 문제는 다음과 같다 그냥  https://defuse.ca/online-x86-assembler.htm#disassembly 에서 

 

mov rax, 0x77

mov rbx, 0x88

mov rcx, 0x99

sub rax, 0x10

 

다음과 같이 작성한 후 돌리면 나오는 String Literal 값이 FLAG이다.

 

2. passcode

문제는 다음과 같다 ida로 main함수를 확인하면 다음과 같다.

 

 

read함수에서 buf에 0x30이나 받기 때문에 bof 취약점이 발생하시만 generate_passcode 함수를 주목해보자

 

 

인자로 들어간 src에 총 8byte의 난수를 생성하여 넣는것을 확인 할 수 있다. 그 후 main함수로 돌아와서 strcncpy로 전역 변수 save에 넣는 것을 확인 할 수 있다. 그리고 strncmp로 save와 src가 같은지 검사하는 것을 보면 카나리를 자체적으로 구현한것을 확인 할 수 있다.

 

그러나 이후 printf 문에서 %s,buf로 main함수의 stack의 값을 출력해주니깐 기존의 카나리 값을 leak하는 방식으로 카나리를 leak하고 이후 다시 한 번더 read함수로 input을 받을때 프로그램에서 자체로 생성한 canary을 그대로 덮어주고, ret를 바이너리 내부 win 함수의 주소로 덮어주면 된다.

 

다음과 같이 exploit코드를 작성하고 실행하면,

 

 

문제가 풀림을 알 수 있다.

 

3. assemlator

문제는 다음과 같다.

 

Ida로 main 함수를 보면 다음과 같다.

scanf로 v4에 입력을 받은 다음 assembly_calc 함수를 호출한다. 따라가 보자.

 

그냥 간단하다 인자로 들어온 값이랑 0xABCD를 xor 연산한 값이 0x123464443이랑 같으면 flag를 준다. 그냥 0xABCD랑 0x123464443를 xor한 값을 input으로 주면 풀린다.

 

4. canacode

 

이번 문제는 다음과 같다.

 

미티게이션은 다음과 같이 걸려 있다.

 

main함수는 다음과 같다. 16짜리 buf에 0x40 만큼 입력을 받으니 bof가 터지고, canary가 있지만 밑에 printf로 stack의 값을 출력해주기 때문에 간단하게 leak이 가능하다 이후 strncmp 조건을 맞추어 exit(0)의 호출을 피하고 ret를 init_shell의 주소로 바꾸어 보자 init_shell의 함수는 다음과 같이 생겼다.

 

여기서도 마찬가지로 bof가 터지고 심지어 stack의 주소까지 꽁으로 주고 있다. 위에 미티게이션 걸린거 보면 nx가 없으니 shellcode를 넣고 ret를 shellcode가 있는 주소로 돌리면 된다. 최종 코드는 다음과 같다.

 

 

실행하면 다음과 같이 shell을 얻을 수 있다.

'WHOIS > Pwnable' 카테고리의 다른 글

Whois 9주차 문제 풀이 과제  (0) 2021.12.03
Whois 7주차 문제 풀이 과제  (0) 2021.11.15