분류 전체보기

Tired of math already? Try getting the highest score possible.Bug정답을 맞추지 못하면 cur->score가 1 감소한다.만약 cur->score가 0이었다면 메모리 상에서 0xffff가 된다.save_game()에서 score를 저장할 때 unsigned short인 cur->score를 8바이트로 캐스팅하는데,이때 signed extension이 진행되어,메모리 상에 0xffffffffffffffff로 저장된다.edit_name()에서 strlen(cur)만큼 read()로 입력을 받는데, score 필드에 null byte가 없기 때문에 play 함수 포인터를 임의의 3바이트 값으로 덮어쓸 수 있다.Exploitfrom pwn import *r = ..
Some more basic mathAnalysisround_1x에는 1336, y에는 -1을 넣으면 되는데, 음수를 입력할 수 없기 때문에 -1 대신 0xffffffff를 입력하면 된다.round_2수학적으로는 조건을 만족하는 x와 y를 찾을 수 없지만,x * y를 1337과 비교하는 것은 4바이트 값들 간의 연산이기 때문에 x * y의 하위 4바이트만 1337이면 된다.round_3입력한 수들은 모두 앞의 수보다 작을 수 없고, 다섯 개의 수들을 모두 더한 결과와 모두 곱한 결과가 같아야 한다. 모두 0을 넣으면 통과할 수 있다.Exploit
Should have let the compiler do it.Bugidx에 음수를 넣을 수 있다.Exploitsize에 플래그를 출력하는 _()의 주소를 쓰고 idx에 -2를 넣으면 플래그를 획득할 수 있다.
Transport the flag securely, right?Buggenerate_key()에서 s에 random key를 생성한 후 strcpy()로 key에 복사한다.기존의 key보다 1바이트만큼 짧은 key를 생성할 경우, strcpy()로 복사할 때 null terminator에 의해 기존의 key의 마지막 1바이트가 사라지게 된다. 이를 이용하면 key의 길이를 1바이트까지 줄일 수 있다.또한, 0x40바이트짜리 key를 생성할 경우, off-by-one이 발생하여 do_comment의 마지막 1바이트를 null byte로 덮어쓸 수 있다.do_comment에 있는 f_do_comment()의 주소의 마지막 1바이트가 null byte가 되면 real_print_flag()의 주소가 된다.Ex..
Free is misbehaving.BugStack address leakArbitrary address writemalloc으로 할당받은 메모리에서 0x10바이트를 읽어와서 rsp+8에 있는 v8에 넣는데, 할당받은 메모리의 주소가 rsp+0x10에 있기 때문에 이 주소를 임의의 주소로 덮어쓸 수 있다.이후에 그 주소에 임의의 0x20바이트 값을 쓸 수 있다.Exploitmain()의 return address를 win()의 주소로 덮어쓰면 플래그를 획득할 수 있다.return 전에 free()에서 터지지 않도록 free()에 들어가는 주소에 fake chunk 구조를 만들어 주어야 한다.from pwn import *r = remote("svc.pwnable.xyz", 30005)sla = r.sen..
homeb0dy
'분류 전체보기' 카테고리의 글 목록