포스팅 썸네일 이미지

War Games/pwnable.xyz

[pwnable.xyz] two targets(50 pts) :: Write-Up

Which one would you exploit? 문제 자체는 되게 직관적이네요. 1~3번으로 준비를 한 뒤에 4번으로 shell을 따면 되려나봐요 그쵸? 아이다로 더 자세히 봅시다. 문제분석 // local variable allocation has failed, the output may be wrong! int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { char *v3; // rsi const char *v4; // rdi signed int v5; // eax char s; // [rsp+10h] [rbp-40h] __int64 v7; // [rsp+30h] [rbp-20h] char *v8; // [rsp..

2020.10.10 게시됨

 포스팅 썸네일 이미지

War Games/pwnable.xyz

[pwnable.xyz] note(50 pts) :: Write-Up

이 글이 wargame 카테고리의 100번째 글이에요! 와아아아 더 열심히 하겠습니다ღ'ᴗ'ღ Note taking 101 일단 문제분석을 해봅시다. 메뉴는 1이면 edit_note()를, 2이면 edit_desc()를, 3이면 종료하네요. 각각 edit_note()와 edit_desc()를 좀 더 봅시다. 먼저 edit_note()입니다. note의 길이를 입력받고, buf에 해당 메모리 만큼 malloc으로 동적할당을 받은 뒤, 입력값을 전역변수 s에 복사합니다. strncpy()를 한 뒤에는 buf는 free()시키네요. 다음은 edit_desc()입니다. 만약 buf에 주소가 할당되어있지 않는 경우, 0x20만큼의 메모리를 동적할당 해주고, buf에 값을 read()를 통해 읽어오네요. 마지막으로..

2020.10.09 게시됨

 포스팅 썸네일 이미지

War Games/pwnable.xyz

[pwnable.xyz] grownup(50 pts) :: Write-Up

Are you old enough for this one? Flag is in the binary itself. 플래그는 바이너리 자체에 있다고 하네요. 잘 분석해봅시다. 일단 main함수를 보면 가장 먼저 setup()함수가 실행되는 것을 확인할 수 있습니다. 일단 전체적인 흐름을 파악하기 위해 이따가 보도록합시다. 그 뒤에서는 18살보다 나이가 더 많은지 적은지 확인한 뒤 y로 대답하는 경우에는 프로그램이 종료되고, 아닌 경우에는 src에 0x84만큼 공간을 할당한 뒤에 이름을 입력받고 종료됩니다. 근데 21번줄에서 프린트하는 방식이 특이하네요. 뭔가 수상하니 우선 qword_601160부터 알아봅시다. 그전에 아까전에 처음 실행된 setup()함수를 확인해 줍시다. signal함수라는 처음보는 함수..

2020.09.17 게시됨

 포스팅 썸네일 이미지

War Games/pwnable.xyz

[pwnable.xyz] misalignment(50 pts) :: Write-Up

Try not using a debugger for this one. pwnable.xyz misalignment입니다. 간단히 포인터 장난인데, 봅시다 v5+7의 값을 0xDEADBEEF에서 0xB000000B5로 값을 바꾸어 주면 되네요. add랑 비슷한 맥락인것 같습니다. 일단 쉬운 이해를 위해 입력을 받기 전 v5의 상태를 보겠습니다. 저렇게 0xdeadbeef가 들어가있는 상황입니다. 리눅스에서는 리틀엔디안 기법이 적용되기때문에 저렇게 반대로 입력이 됩니다. 그럼 우리가 만들고 싶은 상황은 다음과 같겠죠? 네 그럼 v5[0]에는 0xb500000000000000를 넣으면 되고, v5[1]에는 0x0b000000를 넣어주면 됩니다. 입력받는건 10진수로 입력받으니 각 값을 10진수로 바꾸면? v5..

2020.09.08 게시됨

 포스팅 썸네일 이미지

War Games/pwnable.xyz

[pwnable.xyz] xor(50 pts) :: Write-Up

What can you access and what are you going to write? 음 아마도 xor을 해주는게 아닐까 싶네요. 문제 정보에 대해서 확인해봅시다. 여기서 딱히 볼거는 FULL RELRO때문에 GOT overwrite가 불가능하다는것말고는 딱히 없네요. PIE가 걸려있다는 것도 봐줘야 하는데 음... 이따가 다시 보도록 합시다. 일단 아이다로 까봅시다. 전체적으로 add랑 비슷한 흐름이네요. v4와 v5를 xor한 결과를 result[v6]에 넣어주네요. 이때 v4, v5, v6이 모두 우리가 설정해주는 값이기 때문에 우리가 원하는 곳으로 접근이 가능하네요. 단, v6이 9보다 작아야 하기 때문에 result의 영역보다 주소값이 작은 영역만 접근할 수 있겠네요. 또한 flag를 ..

2020.08.12 게시됨

 포스팅 썸네일 이미지

War Games/pwnable.xyz

[pwnable.xyz] Add(50 pts) :: Write-Up

We did some subtraction, now let's do some addition. 정직하게 더한다 솔직히 아무것도 상관은 없다. NX때문에 권한제한이 조금 있다. 대충 v4랑 v5를 잘 조작해주면 될듯 win함수 준걸로봐서 ret값을 이걸로 잘 덮으면 되겠쥬? 나는 v7을 이용할 것이다. 일단 result를 이용하고싶었지만 v7자체는 v6을 통해 11이상의 값을 입력하면 stack영역 그 밑까지 값을 입력할 수 있으므로 v7을 이용해 입력할 것이다.(전문용어로는 out of bound라고 하더라.) v7은 rbp-60h에 있기때문에 v7 + 104가 시작주소(96 + 8) 이때 v7이 배열이라는 점을 잘 생각해보자. v7은 8byte인 __int64를 변수로 두기때문에 v7 + 104에 접근..

2019.11.06 게시됨

 포스팅 썸네일 이미지

War Games/pwnable.xyz

[pwnable.xyz] Welcome(50 pts) :: Write-Up

Are you worthy to continue? 처음에 출력해주는 주소는 v3을 malloc하여 얻은 주소로, 여기를 0으로 만드는게 목적이다. 다른 곳들에 올라와있는 write-up들을 보면 모두 size에 큰 값을 넣어주게 되면 malloc의 리턴 값이 0이 되기 때문에 내가 원하는 주소를 0으로 수정할 수 있다. 하고 끝나던데 이 한줄로 이해가 된다고????? 그래서 저는 삽질을 추가로 했습니다. 아이다로 분석을 해보면 내가 입력하는 데이터도 heap로 들어가고, stack canary도 활성화 되어있어서 '과연 welcome문제인데 canary leak까지 이용을 할까...?'라는 생각으로 stack을 보기보다는 실제 프로그램이 돌아가는 것을 보았다. 다음은 gdb로 까서 일단 실행시켜 본 후 ..

2019.11.01 게시됨