[pwnable.xyz] two targets
Wargame/pwnable.xyz
Which one would you exploit?AttachmentBug임의의 주소에 임의의 4바이트 값을 쓸 수 있다.Exploit두 가지 방법으로 exploit이 가능하다.auth(s)를 true로 만들어서 win() 호출3. Change age의 AAW를 이용하여 GOT overwrite덜 귀찮아 보이는 두 번째 방법을 선택했다.strncmp()의 GOT를 win()의 주소로 덮고 auth()를 실행하면 strncmp()가 호출되어 플래그를 획득할 수 있다.from pwn import *r = remote("svc.pwnable.xyz", 30031)sla = r.sendlineaftersa = r.sendafterwin = 0x40099Cstrncmp_got = 0x603018sla(b"> ",..
[pwnable.xyz] xor
Wargame/pwnable.xyz
What can you access and what are you going to write?AttachmentBugv6에 음수가 들어갈 수 있어서 result보다 낮은 임의의 주소에 임의의 8바이트 값을 쓸 수 있다.Exploit메모리 맵을 보면 코드 영역에 w 권한이 있는 것을 확인할 수 있다. 즉, runtime에 임의의 코드를 수정할 수 있다. main()에서 exit()을 호출하는 부분의 코드를 수정해서 win()이 대신 호출되도록 하고, scanf()에 문자를 입력해서 반복문을 빠져나오면 플래그를 획득할 수 있다.main+148부터 5바이트가 exit()을 호출하는 코드에 해당한다.기계어로는 e8 63 fd ff ff이다. e8은 call에 해당하고, 뒤의 4바이트는 호출할 함수의 주소를 나타..
[pwnable.xyz] note
Wargame/pwnable.xyz
Note taking 101AttachmentBugedit_note()에서 길이 제한이 없어서 note에 buffer overflow가 발생한다.이를 이용하여 note 뒤쪽의 desc에 임의의 주소를 넣을 수 있다.desc에 넣은 주소에 0x20바이트만큼 임의의 값을 쓸 수 있다.Exploitprintf()의 GOT를 win()의 주소로 덮으면 print_menu() 내부에서 printf()가 호출되어 플래그를 획득할 수 있다.from pwn import *r = remote("svc.pwnable.xyz", 30016)sla = r.sendlineaftersa = r.sendafterwin = 0x40093Cprintf_got = 0x601238sla(b"> ", b"1")sla(b"Note len? ..
[pwnable.xyz] GrownUp
Wargame/pwnable.xyz
Are you old enough for this one? Flag is in the binary itself.AttachmentBugname을 최대 0x80바이트까지 입력할 수 있고, strcpy()로 usr에 복사한다.fmt에는 fmt_arr의 주소인 0x601168이 저장되어 있는데, usr에 0x80바이트를 꽉 채워서 복사하면 맨 뒤에 null byte가 붙어서 off-by-one이 발생하여 fmt에 저장된 값이 0x601100으로 바뀌게 된다. 그러면 main()의 마지막 printf()는 printf(0x601100, usr)이 되는데, 0x601100은 usr의 범위에 포함되므로 format string을 임의로 설정할 수 있게 되어 format string bug가 발생한다.Exploitf..
[pwnable.xyz] misalignment
Wargame/pwnable.xyz
Try not using a debugger for this one.AttachmentAnalysisint __cdecl main(int argc, const char **argv, const char **envp){ __int64 s[20]; // [rsp+10h] [rbp-A0h] BYREF s[19] = __readfsqword(0x28u); setup(argc, argv, envp); memset(s, 0, 0x98uLL); *(__int64 *)((char *)&s[1] + 7) = 0xDEADBEEFLL; while ( (unsigned int)_isoc99_scanf("%ld %ld %ld", &s[4], &s[5], &s[6]) == 3 && s[6] = -7 ) { s[..
h0meb0dy_
'분류 전체보기' 카테고리의 글 목록 (14 Page)