[pwnable.xyz] attack
Wargame/pwnable.xyz
Can you win the Arena?AttachmentBugdo_skill_change()에서 isAttack에 음수가 들어갈 수 있어 OOB가 발생한다.ExploitationSkillTabel의 앞쪽에는 Team 구조체 2개로 구성된 Teams가 있다.Teams 내부에는 Equip의 Name 필드가 있는데, 이 필드에는 change_equip()에서 임의의 0x20바이트 값을 입력할 수 있다.이 위치에 win()의 주소를 써 놓고 do_skill_change()에서 player->Skills[destSkill].Skill_Func에 OOB를 이용하여 win()의 주소를 넣으면 그 스킬을 사용할 때 win()이 호출되어 플래그를 획득할 수 있다.ex.py
[pwnable.xyz] rwsr
Wargame/pwnable.xyz
What's your target if you have arbitrary read and write?AttachmentAnalysisArbitrary address readArbitrary address writeExploitationPIE가 비활성화되어 있기 때문에, GOT를 leak하여 libc base address 계산environ을 leak하여 스택 주소 계산 (이때, main()의 스택 프레임과 environ 사이의 거리가 local과 remote 환경에서 다른 점을 고려해야 한다.)main()의 return address를 win()의 주소로 overwriteex.py
[pwnable.xyz] fclose
Wargame/pwnable.xyz
Challenge is using libc 2.23AttachmentAnalysisinput에 fake FILE structure를 만들고 fclose()를 호출한다.Exploitation파일 구조체 전체에 임의의 값을 쓸 수 있기 때문에 vtable overwrite 기법을 이용하여 win()이 실행되도록 할 수 있다. 문제에서는 libc 2.23 버전을 사용하고 있어서 vtable check가 존재하지 않는다.fclose()는 내부적으로 _IO_file_jumps+0x10에 있는 _IO_new_file_finish()를 호출하는데, _IO_new_fclose+48부터 _IO_new_fclose+60까지의 코드가 이 과정에 해당한다. 이 코드까지 도달하기 위해서 딱히 필요한 조건은 없는데, _lock ..
[pwnable.xyz] message
Wargame/pwnable.xyz
Leave a message for the admin.AttachmentBugStack BOF in main()Message를 입력받을 때 stack buffer overflow가 발생한다.OOB read in get_choice()idx가 table의 범위 내에 있는지 확인하지 않아서 OOB read가 가능하다.get_choice()의 return value를 출력해 주기 때문에, 스택에서 char의 크기만큼의 범위에 있는 1바이트 값을 leak할 수 있다.ExploitationOOB read를 이용하여 canary와 PIE base를 leak한 후, stack BOF를 이용하여 main()의 return address를 win()의 주소로 덮으면 플래그를 획득할 수 있다.ex.py
[pwnable.xyz] UAF
Wargame/pwnable.xyz
Is it time for a UAF challenge yet?AttachmentBugstrchrnul()은 문자열에 찾으려는 문자가 없으면 문자열의 끝 주소를 반환한다. 따라서 cur->name에 old_char가 포함되어 있지 않으면 cur->name의 끝에 new_char를 이어붙일 수 있다.ExploitationOff-by-one을 이용하여 name을 play_game 포인터까지 연장할 수 있다.이후에 play_game에 저장된 calc()의 주소를 win()의 주소로 덮어쓰면 플래그를 획득할 수 있다.ex.py
h0meb0dy_
'분류 전체보기' 카테고리의 글 목록 (8 Page)