The Seighbell
Location: Balcony
Problem
I'll hear the bells on Christmas Day Their sweet, familiar sound will play But just one elf, Pulls off the shelf, The bells to hang on Santa's sleigh! Please call me Shinny Upatree I write you now, 'cause I would be The one who gets - Whom Santa lets The bells to hang on Santa's sleigh! But all us elves do want the job, Conveying bells through wint'ry mob To be the one Toy making's done The bells to hang on Santa's sleigh! To make it fair, the Man devised A fair and simple compromise. A random chance, The winner dance! The bells to hang on Santa's sleigh! Now here I need your hacker skill. To be the one would be a thrill! Please do your best, And rig this test The bells to hang on Santa's sleigh! Complete this challenge by winning the sleighbell lottery for Shinny Upatree. elf@062fe4d78ef8:~$
Hints
Shinny Upatree introduces this terminal:
Hey! Mind giving ole' Shinny Upatree some help? There's a contest I HAVE to win.
As long as no one else wins first, I can just keep trying to win the Sleigh Bell Lotto, but this could take forever!
I'll bet the GNU Debugger can help us. With the PEDA modules installed, it can be prettier. I mean easier.
Shinny also provides a link to a recent SANS Pen Test blog on Using gdb to Call Random Functions: https://pen-testing.sans.org/blog/2018/12/11/using-gdb-to-call-random-functions
Solution
elf@c69f161150e6:~$ ls -l total 40 lrwxrwxrwx 1 elf elf 12 Dec 14 16:21 gdb -> /usr/bin/gdb lrwxrwxrwx 1 elf elf 16 Dec 14 16:21 objdump -> /usr/bin/objdump -rwxr-xr-x 1 root root 38144 Dec 14 16:22 sleighbell-lotto
First, use the nm command on the slieghbell-lotto program to list its symbol table. Grepping for "T" narrows down the results to text entries.
elf@c69f161150e6:~$ nm sleighbell-lotto | grep T 0000000000207f40 d _GLOBAL_OFFSET_TABLE_ w _ITM_deregisterTMCloneTable w _ITM_registerTMCloneTable 0000000000208068 D __TMC_END__ 0000000000001620 T __libc_csu_fini 00000000000015b0 T __libc_csu_init 0000000000001624 T _fini 00000000000008c8 T _init 0000000000000a00 T _start 0000000000000c1e T base64_cleanup 0000000000000c43 T base64_decode 0000000000000bcc T build_decoding_table 0000000000000b0a T hmac_sha256 00000000000014ca T main 00000000000014b7 T sorry 0000000000000f18 T tohex 0000000000000fd7 T winnerwinner
Looking over the resulting list, winnerwinner sounds interesting. Start up the gdb debugger and set a breakpoint at the main function using break main
, then run the program with run
.
elf@c69f161150e6:~$ gdb -q sleighbell-lotto Reading symbols from sleighbell-lotto...(no debugging symbols found)...done. (gdb) continue The program is not being run. (gdb) break main Breakpoint 1 at 0x14ce (gdb) run Starting program: /home/elf/sleighbell-lotto [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Breakpoint 1, 0x00005555555554ce in main ()
When the debugger command comes up, type jump winnerwinner
to jump into that function, and we get an instant win!
(gdb) jump winnerwinner Continuing at 0x555555554fdb. ..... ...... ..,;:::::cccodkkkkkkkkkxdc;. ....... .';:codkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkx......... ':okkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkx.......... .;okkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdc.......... .:xkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkko;. ........ 'lkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkx:. ...... ;xkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkd' .xkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkx' .kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkx' xkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkx; :olodxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk; ..........;;;;coxkkkkkkkkkkkkkkkkkkkkkkc ...................,',,:lxkkkkkkkkkkkkkd. ..........................';;:coxkkkkk: ...............................ckd. ............................... ........................... ....................... ....... ... With gdb you fixed the race. The other elves we did out-pace. And now they'll see. They'll all watch me. I'll hang the bells on Santa's sleigh! Congratulations! You've won, and have successfully completed this challenge. [Inferior 1 (process 25) exited normally] (gdb)